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;
}

 

posted @ 2015-04-12 13:20  雪溯  阅读(248)  评论(0编辑  收藏  举报