描述
太空战队顺利地完成了它的第一次使命,这一行动的受益者陆军本部当即决定,请陆军的战士们投票选出最优战舰并报司令总部进行表彰。
为防止有人利用高科技手段造假,陆军本部决定使用最原始的方法进行投票。可不幸的是,陆军的战士正在N个不同的地点执行任务,第i个地点有a[i]名战士参加投票。按照规定,票箱的数量是有限的M(M>=N)个,每个票箱的容量必须完全相同。显然,分配给每个选区的票箱总容量不能比选区的战士数目少。不幸中的万幸,票箱的容量C是可以任意规定的。
陆军本部需要你的帮助来合理地把这M个票箱分给N个不同的选区。为节约成本,你需要在满足每个“选区”投票需求的同时使得每个票箱的容量能够尽量地小。
输入格式
第一行两个整数N、M,表示选区的个数和票箱的个数。
接下来N行每行1个整数,第i+1行的整数a[i]表示第i个选区参与投票的士兵数。
输出格式
一行一个整数C,表示在能够满足选举需求的情况下的最小票箱容量。
测试样例1
输入
2 7
200000
500000
输出
100000
备注
分配给第1个选区2个票箱,第2个选区5个票箱即可。
对于30%的数据,N<=1000, M<=1000, a[i]<=1000.
对于100%的数据,0<N<=100000, 0<M<=1000000, 0<=a[i]<=10000000.
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 1000005; int n,m,a[maxn]; bool check(int t){ int ans = 0,tmp; for(int i = 1;i <= n;i++){ tmp = a[i] / t; if(tmp * t < a[i]) tmp++; ans += tmp; if(ans > m) return false; } return true; } int main(){ cin>>n>>m; int l = 0,r = 0,mid,ans; for(int i = 1;i <= n;i++){ scanf("%d",&a[i]); if(a[i] > r) r = a[i]; } while(l <= r){ mid = (l + r) >> 1; if(check(mid)){ ans = mid; r = mid - 1; }else{ l = mid + 1; } } cout<<ans; return 0; }
时间: 2024-09-29 12:42:05