木棒切割问题,给出N根木棒,长度已知,现在希望通过分割他们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长

本文介绍了一种通过二分查找法解决木棒切割问题的方法,旨在从N根木棒中获得至少K段相同长度的木棒,探讨了如何确定这些木棒的最大可能长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

木棒切割问题,给出N根木棒,长度已知,现在希望通过分割他们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长

思路:运用二分法,求木棒的最大长度,为求第一个满足某条件的问题,由此联想到区间问题(点击链接查看),求右区间,为最大边界,然后减1即为最大值

#include<cstdio>
int a[101];
//思路:运用二分法
int countK(int N,int l)
{
	int k=0;
	for(int i=0;i<N;i++)
		k+=a[i]/l;
	return k;
 } 
 int binarySolve(int N,int K)//K为要求的木棒个数 
 {
 	int mid;
 	int left=0,right=a[0];
 	for(int i=1;i<N;i++)
 	{
 		if(a[i]>right)
 			right=a[i];
	 }
	 while(left<right){
	 	mid=(left+right)/2;
	 	if(K>countK(N,mid))
	 		right=mid;
	 	else left=mid+1;
	 		
	 }
	 return left-1;
 }
 int main()
 {
 	int n;
 	int K;
 	scanf("%d",&n);
 	for(int i=0;i<n;i++)
 	{
 		scanf("%d",&a[i]);
	 }
	 scanf("%d",&K);
	 printf("%d\n",binarySolve(n,K));
	 return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值