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 ",ti,ans); } return 0; }