GCJ 2015-Qualification-B Infinite House of Pancakes 枚举,思路,误区 难度:3

https://code.google.com/codejam/contest/6224486/dashboard#s=p1

题目不难,教训记终生

题目给了我们两种操作:1 所有人都吃一个,简记为消除操作 2 所有人不吃,把一个人的煎饼分给另一个人或者新来的人,简记为分配

明显,分配操作分给新来的人更有利,并且分配操作应该在消除操作之前

现在就是怎么分配的问题:

之前错误了两次,因为误认为直接对半分效率更高,但是对于 1 9这组数据,明显是分成 1 3 3 3比分成1 4 5 更优

所以,枚举分配操作之后的最大煎饼数i,然后分别计算把每个数量大于i的盘子里分到i所需多少次操作tmp.答案取最小的tmp+i即可

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

const int maxn=1e3+3;

const int maxp=1e3+3;

int n;

int num[maxp];



int main(){

    freopen("data.in","r",stdin);

    freopen("data.out","w",stdout);

    int T;

    scanf("%d",&T);

    for(int ti=1;ti<=T;ti++){

        scanf("%d",&n);

        memset(num,0,sizeof(num));

        int ans=0;

        for(int i=0;i<n;i++){

            int tmp;

            scanf("%d",&tmp);

            num[tmp]++;

            ans=max(tmp,ans);

        }

        int mx=ans;

        for(int i=1;i<=mx;i++){

            int tmp=0;

            for(int j=i+1;j<=mx;j++){

                tmp+=(j+i-1)/i*num[j]-num[j];

            }

            tmp+=i;

            ans=min(tmp,ans);

        }

        printf("Case #%d: %d\n",ti,ans);

    }

    return 0;

}

 

你可能感兴趣的:(init)