普及C组第三题(8.13)

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;
    }
}

完结撒花!!!

原文地址:https://www.cnblogs.com/YYCether666/p/11346980.html