E. 分绳子
题目描述
现在有N根绳子,每个绳子的长度是不一样的。你的任务是把这N根绳子分给M个人,每人一根且每个人的绳子的长度是一样的。绳子可以被剪断,但不能把两段绳子接在一起。请你写一段程序根据给定的数据来计算每个人分到的绳子最长能有多长。
输入:
第一行为2个整数,分别代表N(1<=N<=10000)和M(1<=M<=20000)
第二行为N个整数,分别代表这N根绳子的长度(长度值大于等于100且小于等于2000000)。
输出:
为一个整数,为每个人分到的绳子可能的最长长度(绳子只能按整数裁剪,不考虑绳子长度为小数的情况,且测试数据保证有解)。
输入样例
4 11
802
743
457
539
输出样例
200
#include<stdio.h>
int main()
{
int n,m,a[20000],b[20000],max=0;long long all=0;int num=0,x,i,count=0,avg;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
all=all+a[i];
}
avg=all/m;
for(int j=0;j<n;j++)count=a[j]/avg+count;
if(count==m)
{printf("%d",avg);}
else
{
for(int i=0;i<n;i++)
{
b[i]=a[i]/((a[i]/avg)+1);
if(b[i]>max)
{
max=b[i];
x=i;
}
}
for(i=0;i<n;i++)num=a[i]/max+num;
while(num<m)
{
b[x]=0;
for(i=0,max=0;i<n;i++)
{
if(b[i]>=max)
{
max=b[i];
x=i;
}
}
for(i=0,num=0;i<n;i++)
num=a[i]/max+num;
}
printf("%d",max);
}
}