2334. 【NOIP普及组T2】战斗
(File IO): input:fight.in output:fight.out
时间限制: 1000 ms 空间限制: 524288 KB
开始贴图:。。。
题目:
输入:
输出:
样例:
范围:
思路:
这道题很猥琐,很容易想到贪心,很容易贪错。我们只要排个序,然后从大的往小的模拟牵线。是个人就能想出来。(可惜在下非人也!!!)然后你就成功的只拿了一半的分。。。。。。
(ノ=Д=)ノ┻━┻ 咻~。。。嘭~~
然而你只要在每次牵线后再排一次就可以了(数据很小,没有关系)我们来给个数据:
1 6 4 2 2 2 2 2
牵线后会变成->0 1 1 1 1 2
按常规方法来做->0 0 0 1 1 2->0 0 0 0 0 2;
不行,但动动脑子就可以看出这是可以弄完的。我们只要保证大的一定先被排完就可以了,所以再加个sort。
上代码!!!
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int t,k=1,n,sum=0,g=2; int a[801]; bool cmp(int x,int y) { return x>y; } int main() { //freopen("fight.in","r",stdin); //freopen("fight.out","w",stdout); cin>>t; while(k<=t) { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(a[j]!=0&&a[i]!=0) { a[i]--; a[j]--; sum-=2; } else if(a[i]==0) break; } sort(a+g,a+n+1,cmp); g++; } if(sum!=0) cout<<"NO"<<endl; else cout<<"YES"<<endl; k++; sum=0; g=2; } }