P2440 木材加工 题解

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值