两道题目
作者:互联网
咕咕咕!咕了很久的博客终于更新了!
CF720A Closing ceremony
题目大意
N×M个座位有N×M个人,一开始有 k人在(0,0)点上,l个人在(0,m+1)点上,问是否存在一种方案,使得每个人分配点与起始点的曼哈顿距离小于体力值,且每个人都有位置坐。
思路
贪心,考虑把两个起始点的人尽量往两个角塞
先把第一波人按照体力值从小到大排序
为什么不是从大到小排呢?如果体力值大的人把角落塞满了,体力值小的人又走不远,就没地方去了
然后先把位置先分配前 \(K\) 人(当然也可以先分配给后 \(L\) 人)。为了给后 \(L\) 人留够空间,分配时离 \((0, m+1)\) 点越远越好,若路程相同则选择离起点越远越好。
再分配后 \(L\) ,离起点越远越好。
若可行区间内节点都已选择,输出“NO”,否则输出“YES”。
(PS:这道题的算法标签为什么是排序、队列???)
Code(请勿Ctrl+C/V)
// Problem: CF720A Closing ceremony
// URL: https://www.luogu.com.cn/problem/CF720A
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Author: arlenWKX
# include <bits/stdc++.h>
using namespace std;
const int NM = 10005;
int n, m, k, l, a [ NM ], b [ NM ];
bool used [ NM ] [ NM ];
bool __CF720A__ ( );
int main ( )
{
scanf ( "%d%d", & n, & m );
scanf ( "%d", & k );
for ( int i = 1; i <= k; i ++ ) scanf ( "%d", & a [ i ] );
scanf ( "%d", & l );
for ( int i = 1; i <= l; i ++ ) scanf ( "%d", & b [ i ] );
sort ( a + 1, a + k + 1 );
//sort ( b + 1, b + l + 1 );
if ( __CF720A__ ( ) ) printf ( "YES" );
else printf ( "NO" );
return 0;
}
bool __CF720A__ ( )
{
for ( int p = 1; p <= k; p ++ )
{
int xx, yy, ans1 = -1, ans2 = -1;
for ( int i = 1; i <= n; i ++ )
for ( int j = 1; j <= m; j ++ )
if ( ! used [ i ] [ j ] && i + j <= a [ p ] )
{
if ( i + m - j > ans1 )
ans1 = i + m - j, ans2 = i + j, xx = i, yy = j;
else if ( i + m - j == ans1 && i + j > ans2 )
ans1 = i + m - j, ans2 = i + j, xx = i, yy = j;
}
if ( ans2 == -1 ) {/*printf ( "[a] %d failed\n", p ); */printf ( "rp++");return 0;}
/*printf ( "[a] %d : %d, %d\n", p, xx, yy );*/
used [ xx ] [ yy ] = 1;
}
for ( int p = 1; p <= l; p ++ )
{
int xx, yy, ans2 = -kidding_you;
for ( int i = 1; i <= n; i ++ )
for ( int j = 1; j <= m; j ++ )
if ( ! used [ i ] [ j ] && i + m + 1 - j <= b [ p ] )
{
if ( i + m - j + 1 > ans2 )
ans2 = i + m + 1 - j, xx = i, yy = j;
}
if ( ans2 == -1 ) {/*printf ( "[b] %d failed\n", p ); */return 0;}
/*printf ( "[b] %d : %d, %d\n", p, xx, yy );*/
used [ xx ] [ yy ] = 1;
}
return 1;
}
CF3B Lorry
题目大意
有一个体积为 v 的背包,一共有 n 个物品,每个物品的体积为 ti,价值为 pi 。现要从中取若干物品放入背包,使背包中物品的价值和最大。
思路
贪心。
假设所有的物品都是同一类的,那么显然应该选价值更大的更优,所以对于每一列我们将物品按价值从大到小排序。
枚举体积为 \(1\) 的物品选几个,剩下空间全部放体积为 \(2\) 的物品,取价值的最大值即可。
代码
// Problem: CF3B Lorry
// URL: https://www.luogu.com.cn/problem/CF3B
// Memory Limit: 62.50MB
// Time Limit: 2000 ms
// Author: arlenWKX
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, v, cnt1, cnt2, pos1, pos2, ans, sum, pre [ N ];
struct wtf
{
int p, id;
bool operator < ( const wtf & b ) const
{ return p > b.p; }
} t1 [ N ], t2 [ N ];
int main ( )
{
scanf ( "%d%d", & n, & v );
for ( int i = 1; i <= n; i ++ )
{
int t, p;
scanf ( "%d%d", & t, & p );
if ( t == 1 ) t1 [ ++ cnt1 ] = { p, i };
else t2 [ ++ cnt2 ] = { p, i };
}
sort ( t1 + 1, t1 + cnt1 + 1 );
sort ( t2 + 1, t2 + cnt2 + 1 );
for ( int i = 1; i <= cnt2; i ++ ) pre [ i ] = pre [ i - 1 ] + t2 [ i ].p;
for (int i = 0; i <= min ( v, cnt1 ); i ++ ) {
sum += t1[i].p;
if ( sum + pre[min(cnt2, (v - i) / 2)] > ans )
{
ans = sum + pre[min(cnt2, (v - i) / 2)];
pos1 = i, pos2 = min(cnt2, (v - i) / 2);
}
}
printf ( "%d\n", ans );
for ( int i = 1; i <= pos1; i ++ ) printf ( "%d\n", t1 [ i ].id );
for ( int i = 1; i <= pos2; i ++ ) printf ( "%d\n", t2 [ i ].id );
return 0;
}
以下内容与题目无关
安利一个超好用的编辑器 —— CP Editor,
(咦?这是Win11?)
大家熟知的那些 IDE 往往都是为工程开发而设计的,所以在算法竞赛中用起来多少会有些不顺手的地方,想要却没有的 feature。在这些 IDE 中,Dev C++ 是不怎么配置就比较适合 OI 的,而 VS Code 在经过繁杂的配置后可以更加好用。但是,有没有一款 IDE,既不需要繁杂的配置,又能在 OI 这个领域中,在某些方面上,甚至胜过 VS Code 呢?
CP Editor
CP Editor 是一款专门为算法竞赛设计的 IDE,有一键编译并在测试数据上运行,从 OJ 获取样例,在 IDE 内提交至 CF,代码模板等功能。它是一款刚诞生不久的自由软件,以后还会变得越来越好。这款 IDE 是跨平台的,支持 Windows, Linux, MacOS。
GitHub Repo
如何使用?
点击下载安装即可
<iframe sandbox="allow-scripts allow-same-origin" src="https://carbon.vercel.app/embed?bg=rgba%28171%2C+184%2C+195%2C+1%29&t=monokai&wt=none&l=auto&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=56px&ph=56px&ln=true&fl=1&fm=Hack&fs=14px&lh=133%25&si=false&es=2x&wm=false&code=%2523%2520include%2520%253Cbits%252Fstdc%252B%252B.h%253E%250A%250Ausing%2520namespace%2520std%253B%250A%250A%250Aint%2520main%2520%28%2520%29%250A%257B%250A%2520%250A%2520%2520cout%2520%253C%253C%2520%2522Hello%2520World%21%2522%2520%253C%253C%2520endl%253B%250A%2520%2520%250A%2520%2520return%25200%253B%250A%2520%2520%250A%257D" style="width: 477px; height: 429px; border: 0; transform: scale(1); overflow: hidden"> </iframe>标签:题目,int,ans2,yy,xx,printf,IDE,两道 来源: https://www.cnblogs.com/wukaixuan/p/15666601.html