华华给月月的礼物(二分法)

卡朋名 2022-07-24 17:40:28

题目链接:https://ac.nowcoder.com/acm/contest/22353/F

事先声明一下,这题本人的答案结果超时了,所以这里仅供读者当练习使用,文章如有不当之处恳请大佬们完善。


题目要求:输入正整数N和K,分别表示原本根数和希望根数,再自己输入各根木头的长度。

输出结果为裁剪后可获得的最大长度。

        思路:二分法——这题要在保证数目的情况下越长越好,所以为了避免出现长度太长 一些短根的木棍无法裁剪从而导致数量减少的情况,我们需要找到最短的那根木棍,再对这跟木棍的长度进行二分处理,经过不断二分找到符合最后根数的最大长度。

        首先,定义一个容器来储存原有的木棍

 然后再找到这些木棍中最短的那根木棍

 

找到最短木棍后对他的长度进行二分处理,设定mid=(l+r)/2,如果得出的根数多了则说明短了,mid值右移 l=mid,反之相反。

 

接下来是完整的代码实现 

#include<bits/stdc++.h>
using namespace std;
int N,k,n;
vector<int> L;
int work(int x)//确定能总共能切多少根 
{
	int gs=0;
	for(vector<int>::iterator it=L.begin();it!=L.end();it++)
	{
		gs=gs+(*it/x);//每根能切出的根数 
	}
	return gs;
}
int main()
{
	cin>>N>>k;//输入原本的根数N和希望获得的根数K 
	for(int i=0;i<N;i++)
	{
	 cin>>n ;
	 L.push_back(n);
	}
	int min;
	min=L[0];
	for(vector<int>::iterator it=L.begin();it!=L.end();it++)
	{
		if(min>*it)min=*it;//找到这些木棍中最短的那根 
	}
	int l=1,r=min;
	while(l+1!=r)
	{
		//对最短的那一根长度进行二分 
		int mid=l + ((r - l) >> 1);
		if(work(mid)<=k)r=mid;
		else l=mid;
	}
	cout<<l;
}

 

...全文
34 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

137

社区成员

发帖
与我相关
我的任务
社区描述
大家一起打造学校的社区吧,加强学习沟通和进步!
javapythonc++ 高校 内蒙古·通辽市
社区管理员
  • c_university_357
  • 小学生一个
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧