当前位置: 代码迷 >> 综合 >> P2440 木材加工 题解
  详细解决方案

P2440 木材加工 题解

热度:37   发布时间:2023-11-24 11:45:25.0

这是一道二分答案的题目,根据题目已知,我们需要找到最大的木条长度‘,使所有木头按照这个长度等分可以达到要求的木段数量,当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的溢出问题,如有同学能看到并做以修改,将不胜感激。