二分的思想 好像也没体现出动归。。。
#include <iostream>
#include <cstdio>
using namespace std;
int wood[10001];
int total = 0;
int main()
{
// freopen("in2.txt","r",stdin);
// freopen("outMy.txt","w",stdout);
int N,K;
scanf("%d%d",&N,&K);
for(int i = 0; i < N; ++i)
{
scanf("%d",&wood[i]);
total += wood[i];//把木头合成一个长木头来看
}
if( K > total)//首先判断K,N是不是合理的数 这里N是可以大于K的。。。因为是要切割成长度相等的K段
{
printf("0\n");
return 0;
}
else if(K == total)//这种情况 只能1cm来切了 直接输出 不用计算
{
printf("1\n");
return 0;
}
else
{
int left = 1, right = total / K; //开始切木头 二分的思想 又端点最大为 total / K
while(true)
{
if(right -left <= 1)
{
right = (left + right) / 2;//right 和left 只相差1的时候 一直按这个mid值在切木头 但是这以后都是一样的结果了 所以强制在这里退出
break;
}
int mid = (left + right) / 2;
// cout<<left<<endl;
// cout<<mid<<endl;
// cout<<right<<endl<<endl<<endl;
int tem = 0;
for(int i = 0; i < N; ++i)
tem += wood[i] / mid;
if(tem < K) //以mid来切木头 不够 说明mid过大
{
right = mid;
}
else if(tem >= K)//够切 甚至超过了要求的K段 说明mid过小 或者刚好可以继续增加mid
{
left = mid;
}
}
printf("%d\n",right);
}
return 0;
}