简单贪心-HDU 5835-Danganronpa

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SZU_Crayon/article/details/82083861
  • 简单贪心-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;
}

猜你喜欢

转载自blog.csdn.net/SZU_Crayon/article/details/82083861