题解:P13212 [GCJ 2015 Qualification] Infinite House of Pancakes / [SNOW] - 75
fish_love_cat · · 题解
写于省选 Day 1 晚。
28 + 15 + 12 = 55pts,我该在哪里停留?我问我自己。
Day 2 至少让我切一题吧。
首先分菜的收益是多一张嘴可以吃的更快,因此一定会放到空盘子里。
一个显然的观察是先把菜分好肯定是不劣的,因为输出更强的时候再集火一定不会比打一半再加杆枪来的优。
另外的每个人的输出功率相同,因此答案只与煎饼最多的人有关。
于是你分煎饼肯定要均分以最小化最大值。
那么对于指定的残留数量,我们可以得到每一堆需要分裂成的堆数,显然分裂后的堆数减一就是分裂操作的需要个数。
数据范围不大考虑直接上大力做法,直接枚举分裂后的每一堆的大小,然后计算分裂操作的次数,对每一种答案取最小值即可。
时间复杂度
#include<bits/stdc++.h>
using namespace std;
int a[1005];
void solve(int op){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int ans=1000;
for(int i=1;i<=1000;i++){
int sum=i;
for(int j=1;j<=n;j++)
sum+=a[j]/i+(a[j]%i!=0)-1;
ans=min(ans,sum);
}
printf("Case #%d: %d\n",op,ans);
}
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++)solve(i);
return 0;
}
// 就是因为这样,我才为了你接受委托的。
// #75
Day 2 RP++!