【Codeforces Round #428 (Div. 2) B】Game of the Rows
【Link】:http://codeforces.com/contest/839/problem/B
【Description】
给你n排的如题目所示的位置;
同一排中(1,2) 算相邻;
(3,4),(4,5),(5,6)算相邻,然后(7,8)算相邻;
这里的(x,y)表示某个人坐在x,另外一个人坐在y的话.
问你够不够安排k组的人;
使得相邻座位的人都是相同组的人;
是则输出YES….
【Solution】
中间的那4个位置;
是没办法用来放不同组的成对的.
也即
xxyy不能放在中间那4个位置.
但xx和yy可以放在最左边和最右边的那两个连续位置;
则,我们中间那4个位置;
先尽可能地放同一组的4个人
这样,能尽量避免不同组的人到中间那4个位置
不同组的人到了中间那4个位置肯定不能最大化利用这4个位置的
因为肯定会有空座位
剩余的不同组的人,则可以安排在两侧的连续位置
中间那4个位置安排过后;
有两种情况.
第一种
n排所有的中间4个位置的都被安排光了;
剩下的组中可能还有大于4的人.
这个时候,只有最左边和最右边的连续两个块可以使用了;
则还剩下n*2个连续的对的空间;
如果某一组为奇数;
则那个多出来的人单独占据一对的空间即可;
否则就贪心地用这n*2个连续对就好;
第二种
这n排中,有一些排中间的4个位置还是空的.
这个时候,所有组的人数都已经小于4了;
我们先考虑一组中还有2..3个人的.
先把其中两个人优先安排到最左和最右的(1,2)或(7,8)位置;
我们有n*2个那样的(1,2)或(7,8)位置;
(即每行两边都有两个)
但可能这n*2个对还不够用;
可能还是有一些组有2..3个人;
则,我们再给他安排在(4,5)的位置;
注意,
这个时候,我们一旦安排在了(3,4);
那么那一行就只有位置6还能放单个的人了;
可能(4,5)的位置放完了以后还是不够;
也即还是有一些组有2..3个人
这个时候;就利用我们刚才在中间放了(3,4),而6还能放单个的人这一点;
两个那个位置5,就又能凑成一对了;
(这种放一对的方案,很容易被漏掉)
如果还是有一些组有2..3个人,那么就不行了;
输出无解;
否则,考虑剩下的组中还剩一个人的组
那一个人可以放在n*2个对里面(如果对还没用完的话),或者放在
中间连续的4个空位也即(3,4)和(5,6)中的3和6,这个时候中间的4个位置可以用其中的两个,所以减去了连续的4个空位置的个数之后,还有递增单个位置,也即上面提到的当个的位置6
或者
放在单个的位置6
这3种考虑后如果还不行就无解;
(就是说那一个人放不下的话)
【NumberOf WA】
4
【Reviw】
分成两行放一对那种方法没想到.
一开始认为超过8就直接放一整行的天真想法是错的。
【Code】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 100;
int n,k,a[N+10],cur4,cur2,cur;
int main(){
//Open();
//Close();
ri(n),ri(k);
rep1(i,1,k) {
ri(a[i]);
}
cur4 = n;
if (cur4)
rep1(i,1,k)
if (a[i]>=4){
int temp = min(a[i]/4,cur4);
cur4-=temp;
a[i] -= temp*4;
if (cur4==0) break;
}
if (cur4 > 0){//全都小于4了
int pairs = n*2;
for (int i = 1;i <= k && pairs > 0;i++)
if (a[i] > 1){
pairs--;
a[i]-=2;
}
int singlec = 0;
rep1(i,1,k)
if (a[i] > 1){
if (cur4 > 0){
cur4--;
singlec++;
a[i]-=2;
continue;
}
if (singlec >= 2){
singlec-=2;
a[i]-=2;
continue;
}
return puts("NO");
}
rep1(i,1,k)
if (a[i]==1){
if (pairs){
pairs--;
continue;
}
if (singlec){
singlec--;
continue;
}
if (cur4){
cur4--;
singlec++;
continue;
}
return puts("NO"),0;
}
puts("YES");
}else{ //cur4==0
int pairs = n*2;
rep1(i,1,k)
if (a[i] > 0){
pairs-=((a[i]-1)/2+1);
if (pairs < 0) return puts("NO"),0;
}
puts("YES");
}
return 0;
}
【Codeforces Round #428 (Div. 2) B】Game of the Rows的更多相关文章
- 【Codeforces Round #428 (Div. 2) C】Journey
[Link]:http://codeforces.com/contest/839/problem/C [Description] 给一棵树,每当你到一个点x的时候,你进入x的另外一每一个出度的概率都是 ...
- 【Codeforces Round #428 (Div. 2) A】Arya and Bran
[Link]: [Description] [Solution] 傻逼题 [NumberOf WA] [Reviw] [Code] #include <bits/stdc++.h> usi ...
- 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...
- 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes
[题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...
- 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees
[题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...
- 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory
[题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...
- 【Codeforces Round #423 (Div. 2) C】String Reconstruction
[Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...
- 【Codeforces Round #423 (Div. 2) B】Black Square
[Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...
- 【Codeforces Round #423 (Div. 2) A】Restaurant Tables
[Link]:http://codeforces.com/contest/828/problem/A [Description] 有n个组按照时间顺序来餐馆; 每个组由一个人或两个人组成; 每当有一个 ...
随机推荐
- [NOIP2013提高组]火柴排队
题目:洛谷P1966.Vijos P1842.codevs3286. 题目大意:有两排火柴,每根都有一个高度.设a.b分别表示两排火柴的高度,现在要令$\sum(a_i-b_i)^2$最小.现两排火柴 ...
- CentOS下安装SVN服务端
---恢复内容开始--- 1.使用yum安装 yum install subversion 2.创建仓库 1.创建成功后在svn下面多了几个文件夹. cd /home mkdir svn svnadm ...
- 紫书 例题 10-7 UVa 10820 (欧拉函数)
这道题要找二元组(x, y) 满足1 <= x, y <= n 且x与y互素 那么我就可以假设x < y, 设这时答案为f(n) 那么答案就为2 * f(n) +1(x与y反过来就乘 ...
- photoshop快捷键汇总
图层应用相关快捷键: 复制图层:Ctrl+j 盖印图层:Ctrl+Alt+Shift+E 向下合并图层:Ctrl+E 合并可见图层:Ctrl+Shift+E 激活上一图层:Alt+中括号(]) 激活下 ...
- 题解 CF896C 【Willem, Chtholly and Seniorious】
貌似珂朵莉树是目前为止(我学过的)唯一一个可以维护区间x次方和查询的高效数据结构. 但是这玩意有个很大的毛病,就是它的高效建立在数据随机的前提下. 在数据随机的时候assign操作比较多,所以它的复杂 ...
- CodeForces 316c1 Tidying Up
Tidying Up Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Orig ...
- cocoapods的安装,使用,卸载,以及你可能会遇到的坑..
首先, 不会用cocoapods的话如过你接手某些新项目是用cocoapods写的你会疯, 其次他真的非常好用, 当然某些坑也是存在的,比方你用它导入了AFNetwork然后你须要改动一些AF的内部的 ...
- BZOJ 2982 combination Lucas定理
题目大意:发上来就过不了审核了--总之大意就是求C(n,m) mod 10007 m,n∈[1,2*10^8] 卢卡斯定理:C(n,m)=C(n%p,m%p)*C(n/p,m/p) mod p 要求p ...
- 《Spring技术内幕》笔记-第四章 Spring MVC与web环境
上下文在web容器中的启动 1,IoC容器的启动过程 IoC的启动过程就是建立上下文的过程.该上下文是与ServletContext相伴.在Spring中存在一个核心控制分发器,Dispatcher ...
- HDU 1730 Northcott Game
简单的尼姆博弈.想到了非常easy! 就拿一行举例.怎么赢.? 就是死劲挨着对方移,当然假设本身就是挨着的,又轮到你移动了,那么对于这一行来讲.你就是输的!! 由此可见每一行的棋子起始距离就显得尤为重 ...