1193: 那些年我们用过的网盘
Description
现在越来越多的人将资料放到各大网盘上来备份自己的数据,但是学校的网速众所周知,是乌龟中的战斗龟。网络中心为了缓解大家的情绪,推出了校园网盘,我和我的小伙伴们都惊呆了。但是如何合理的设计,成了一个巨大的问题,大家能帮忙解决吗?
学校一共有N个班级,每个有不同的人数A,网络中心共有M个网盘(大于班级数),现在想要给每个班级的每个人1G的存储量,为了能够很好的区分,一个网盘里面只能是同一个班级的学生,并且每个网盘至少都有一个学生。为了尽量节约资源,你能告诉网络中心每个网盘至少需要多大的容量才能满足要求吗?
例如,这儿2个班级,分别为50人和70人;
如果这里4个网盘。那么我们可以得出最少每个网盘需要35G的容量才能满足要求,每个班各占2个网盘;
如果只有3个网盘,那么每个至少需要50G的容量,其中一个给50人班级,另外两个给70人的班级。
Input
含有多组数据
第一行为N,M,其中0<N<10000,N=<M<1000000,分别代表班级数和网盘数
接下来N行每行一个数A,分别代表每个班级的人数,0<A<2000000。
Output
输出需要的最少容量,格式见样例
Sample Input
2 4 50 70 2 3 50 70 4 6 120 2680 3400 200
Sample Output
35 50 1700
解法:二分答案
#include<iostream>
#include<cstdio>
using namespace std;
int da[10010],n,m;
int can(int x)
{
int i,tot=0;
for (i=1;i<=n;i++)
{
tot+=da[i]/x;
if (da[i]%x!=0) tot++;
}
if (tot>m) return 0;
return 1;
}
int erfen(int a,int b)
{
int mid;
if (a==b) return a;
mid=(a+b)/2;
if (can(mid)) return erfen(a,mid);
else return erfen(mid+1,b);
}
int main()
{
int i,j,ma;
while (scanf("%d%d",&n,&m)!=EOF)
{
cin>>da[1];
ma=da[1];
for (i=2;i<=n;i++)
{
cin>>da[i];
if (da[i]>ma) ma=da[i];
}
cout<<erfen(1,ma)<<endl;
}
return 0;
}