soj1193 那些年我们用过的网盘

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

posted @ 2013-07-10 21:37  认真coding的小八  阅读(174)  评论(1编辑  收藏  举报