-
简单贪心-HDU 5835-Danganronpa
-
题目链接:
Danganronpa
-
思路:
题目大意:
给你有n种礼物,第i种有ai个。现在要把这些礼物分给一排同学,要求每个人发普通礼物和神秘礼物各一个,要求相邻两人的普通礼物不能为同一种,神秘礼物没有限制,普通礼物和神秘礼物都从这n个礼物中选取。问最多能发给多少人。
题解:
为了让相邻的普通礼物不重合,除了数量最多的礼物外,其余礼物间隔放,用数量最多的礼物去插空
a.插空满,可以保证相邻普通礼物不同,把后排的礼物依次填上,最多有(Sum-MAX)*2 的人可以得到两件礼物,其实简单说就是把插空满的那一排,每张桌子再放一个数量最多的礼物,但此时,数量最多的礼物还可以作为普通礼物放在末尾一个,然后也把数量最多的礼物当成神秘礼物,最终有(Sum-MAX)*2+1。
如果此时数量最多的礼物不足以放满每张已经放有一个礼物的桌子,此时把落单的礼物往前放,最后有两个礼物的桌子一共有Sum/2
b.插空不满,把落单的往前面插空完成的桌子上放礼物,最终是Sum/2
对于两种情况,取最小可能
-
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
int t=0;
while(T--)
{
int n;
int sum=0;
int max_pre=-1;
int pre;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>pre;
sum+=pre;
max_pre=max(max_pre,pre);
}
int T1=sum/2;
int T2=(sum-max_pre)*2-1;
cout<<"Case #"<<++t<<": "<<min(T1,T2)<<endl;
}
return 0;
}