http://codeforces.com/contest/839/problem/B
给定座位, 两边两个,中间4个,要求不同队伍的不能挨着。
问你怎么排列。
发现,当有一个人时,他放在2 和4 都是可以的。效果一样。
一个2可以放一个4。
策略:先放4,然后放2,他们对下面的影响可以保存qwq
#include <bits/stdc++.h>
/* 计算小于8的数量,如果是 1 2 的话,就给小的座。
否则 就给大的座。模拟一下。
。。大概想到的是尽可能的给4,但是错了数据。
将 数据分成 三种 4 2 1.
因为 他们都是一样的。
*/
using namespace std;
const int maxn=1e4+10;
int a[maxn];
int main()
{ int m,n;
while(~scanf("%d%d",&m,&n)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//优先放 四人。
int sum2=m*2;
int sum4=m;
for(int i=0;i<n;i++){
int d=min(sum4,a[i]/4);
sum4-=d;
a[i]-=4*d;
}
sum2+=sum4;
for(int i=0;i<n;i++){
int d=min(sum2,a[i]/2);
sum2-=d;
a[i]-=2*d;
}
//cout<<sum2<<endl;
int sum3=sum2+sum4;
for(int i=0;i<n;i++){
while(a[i]){
sum3--;
a[i]--;
//cout<<a[i]<<endl;
}
}
//cout<<sum3<<endl;
if(sum3>=0)
puts("YES");
else
puts("NO");
}
return 0;
}