Codeforce-839B Game of the Rows 思维

B. Game of the Rows
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Daenerys Targaryen has an army consisting of k groups of soldiers, the i-th group contains ai soldiers. She wants to bring her army to the other side of the sea to get the Iron Throne. She has recently bought an airplane to carry her army through the sea. The airplane has n rows, each of them has 8 seats. We call two seats neighbor, if they are in the same row and in seats {1, 2}{3, 4}{4, 5},{5, 6} or {7, 8}.

A row in the airplane

Daenerys Targaryen wants to place her army in the plane so that there are no two soldiers from different groups sitting on neighboring seats.

Your task is to determine if there is a possible arranging of her army in the airplane such that the condition above is satisfied.

Input

The first line contains two integers n and k (1 ≤ n ≤ 100001 ≤ k ≤ 100) — the number of rows and the number of groups of soldiers, respectively.

The second line contains k integers a1, a2, a3, ..., ak (1 ≤ ai ≤ 10000), where ai denotes the number of soldiers in the i-th group.

It is guaranteed that a1 + a2 + ... + ak ≤ 8·n.

Output

If we can place the soldiers in the airplane print "YES" (without quotes). Otherwise print "NO" (without quotes).

You can choose the case (lower or upper) for each letter arbitrary.

Examples
input
2 2
5 8
output
YES
input
1 2
7 1
output
NO
input
1 2
4 4
output
YES
input
1 4
2 2 1 2
output
YES
Note

In the first sample, Daenerys can place the soldiers like in the figure below:

In the second sample, there is no way to place the soldiers in the plane since the second group soldier will always have a seat neighboring to someone from the first group.

In the third example Daenerys can place the first group on seats (1, 2, 7, 8), and the second group an all the remaining seats.

In the fourth example she can place the first two groups on seats (1, 2) and (7, 8), the third group on seats (3), and the fourth group on seats (5, 6).



这道题真是把我好一顿虐 

wa了好多发

题意就是要你判断 按照题目给定的约束在n排座位中 能否坐下k组人 要求每组人的临界位置上要么没人 要么是同组的人 邻接位置是(1,2)(3,4)(4,5)(5,6)(7,8)


有很多要注意的地方

要尽可能做的下 

安排策略:

注意我们应该先消耗中间的位置 因为中间的位置 

1要么做4个人同组的 

2要么就分两组

(3,4)两个人一组 然后 (5,6)空5,另外一组的1个坐6 反之亦可


我们要尽可能先把中间的消耗掉 如果有个组人数是奇数 那么他总有一个人要消耗两个座位

因为中间的不易安排 所以我们可以先把每个组单独的1放到中间一组 此后中间剩下的位置就和两边的没什么不同了 我们可以用一个reminder记录剩下的中间组


此后所有组变成偶数个人

然后我们再尽可能的消耗剩下中间完整的部分 尽可能地消耗中间位置 因为中间位置有两个邻接约束 不易处理 把所有的中间完整的位置消耗结束后 再消耗两边的

两边的没啥约束 随便消耗

若是每组人都是2  

此时两边消耗完了 只剩中间完整的了 我们在把中间的拆开 因为我们是可以把一个一组是2的组拆成两个1的 所以我们把中间消耗掉  此时由于组人数是2(每组经过处理已经是奇数了)每消耗掉一个完整的reminder++ 剩下的reminder可以用来继续放 只是不能放两个人 只能用来放一个人 

若是之后中间完整的也消耗完了  若是剩下的人数正好小于等于reminder也就是说 正好可以让每个reminder坐一个人 然后空下一个位置 完美坐下并且匹配所有情况!

code:

#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
	int n,k;

	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)scanf("%d",&a[i]);

	int sc = n,r = 0;
	int se2 = n*2;
	bool f=0;
	for(int i=1;i<=k;i++){
		if(a[i]%2==1){
            if(sc>0)sc--,r++,a[i]--;
            else if(r>0)r--,a[i]--;
            else if(se2>0)se2--,a[i]--;
            if(a[i]%2==1){
                f=1;
                break;
            }
        }
	}

	se2+=r,r=0;
	if(!f)
        for(int i=1;i<=k;i++){
            while(a[i]>=4&&sc>=1)sc-=1,a[i]-=4;
            while(a[i]>0&&se2)se2--,a[i]-=2;
   
            if(se2==0&&a[i]&&sc)sc--,a[i]-=2,r++;
            else if(sc==0&&se2==0&&a[i]<=r)r-=a[i],a[i]=0;
            if(a[i]>0){
                f=1;
                break;
            }
        }
	if(!f)puts("YES");
	else puts("NO");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值