您的位置:首页 > 理论基础 > 计算机网络

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

2016-09-09 13:22 399 查看

题意

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

思路

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

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
const int M = 26;
int s
;
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;i<n;i++){
scanf("%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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: