2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

题意

n种礼物,每种有a[i]个,所有的礼物可以作为普通礼物,也可以作为神秘礼物放在桌子上,相邻的桌子上不能放同样的普通礼物,问最多能拜几张桌子。

思路

这题当时的做法有问题,正解是用优先队列来存礼物数,取出最大的两个a,b(a>b),然后放2b个,剩下a-b个放回队列中,循环操作求出来一个sum1;把所有的数量累加起来得到sum2,ans = min(sum1,sum2/2);

代码

#include 
using namespace std;
const int N = 15;
const int M = 26;
int s[N];
priority_queue<int> q;
int main()  {
    int t,n,kas = 1;
    scanf("%d",&t);
    while(t--)  {
        int ans = 0,sum=0,k=0;
        while(!q.empty())
            q.pop();
        scanf("%d",&n);
        for(int i=0;iscanf("%d",&s[i]);
            sum+=s[i];
            q.push(s[i]);
        }
        sum/=2;
        int a,b;
        while(!q.empty()){
            if(k){
                b=q.top();
                q.pop();
                ans+=2*b;
                q.push(a-b);
            }
            else{
                a=q.top();
                q.pop();
            }
            k^=1;
        }
        if(a!=0) ans++;
        printf("Case #%d: %d\n",kas++,min(ans,sum));
    }
    return 0;
}

你可能感兴趣的:(题解)