这是一道二分答案的题目,根据题目已知,我们需要找到最大的木条长度‘,使所有木头按照这个长度等分可以达到要求的木段数量,当mid所对应的木头段数少于要求的,将left=mid-1,否则就将right=mid+1;
这道题如果稍不注意就会RE,注意题目说:如果连 1cm 长的小段都切不出来,输出 0。
所以可以在输入时就开始求木段长度和,如果木段长度和除以要求的木段数已经大于0了,那么flag就为1,如果flag=0那么就直接输出0,跳出循环。
#include <stdio.h>
int main()
{
long int n,m,flag=0;scanf("%ld %ld",&n,&m);long int a[n+5],i,max=0;long long sum=0;for(i=0;i<n;i++){
scanf("%ld",&a[i]);if(a[i]>max) max=a[i];sum=sum+a[i];if((sum/m)!=0) flag=1;}long int left=0,right=max;if(flag==0){
printf("0");return 0;}long long s,j;while(left<=right){
s=0;long int mid=(right-left)/2+left;for(j=0;j<n;j++)s=a[j]/mid+s;if(s<m) right=mid-1;else left=mid+1;}printf("%d",left-1);}
这个题解还是有很多问题,比如sum的溢出问题,如有同学能看到并做以修改,将不胜感激。