HDU 5835 Danganronpa(贪心)

142 篇文章 0 订阅

Description
n种礼物,每种礼物ai个,要求将礼物送给尽可能多的人,每个人需要一份神秘礼物和一份普通礼物,要求相邻两人的普通礼物不相同
Input
第一行一整数T表示用例组数,每组用例首先输入一整数表示礼物种类数,之后n个整数ai表示每种礼物的数量(T<=10,1<=n<=10,1<=ai<=10^5)
Output
对于每组用例,输出能够收到礼物的最多人数
Sample Input
1
2
3 2
Sample Output
Case #1: 2
Solution
先将a序列从小到大排序,令sum=a[1]+…+a[n],若a[n]不太大,那么完全可以1 2 … n 1 2… n … 2 3 … n … 这样每次从每种礼物中拿一个从小到大给一些人作为普通礼物,在保证神秘礼物数量的情况下可以一直将礼物用完或只剩一件,这样最多可以给sum/2个人;若a[n]比较大,那么贪心的尽可能多的去使用第n种礼物,即采取n x n …n x n这作为普通礼物的发放方式,然后把剩余的第n种礼物都当做神秘礼物,这样最大可以发放给(sum-a[i])*2+1个人,故ans=min(sum/2,(sum-a[n])*2+1)
Code

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 11
int T,n,a[maxn],sum,Case=1;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        sort(a+1,a+n+1);
        int ans=min(sum/2,(sum-a[n])*2+1);
        printf("Case #%d: %d\n",Case++,ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值