算法丑陋,速度略慢,还望指教。
/****************************************************
**文件名:poj2774
**Copyright (c) 2010-2020 OrdinaryCrazy
**创建人:OrdinaryCrazy
**日期:20170802
**描述:百炼2774参考答案
**版本:1.0
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
int n,k;
int logn[10000];
//一个很直观的想法,就是我们从0开始枚举小段的长度,
//然而这样是必然超时的,所以我们就从0-10000二分查找
int check(int mid)
{
int i,j=0;
for(i=0;i<n;i++)
j+=logn[i]/mid;
if(j<k)
return 1;
else
return 0;
}
int main()
{
int i,roof=0,floor=1,mid=0;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
scanf("%d",&logn[i]);
for(i=0;i<n;i++)
roof+=logn[i];
if(roof/k==0)
{
printf("%d",0);
return 0;
}
while(1)
{
if(roof-floor<2)
break;
mid=(roof+floor)/2;
if(check(mid))
roof=mid;
else
floor=mid;
}
printf("%d",floor);
return 0;
}