李初一


私信TA

用户名:dotcpp0619305

访问量:413

签 名:

等  级
排  名 4156
经  验 1685
参赛次数 0
文章发表 8
年  龄 19
在职情况 学生
学  校 成都理工大学工程技术学院
专  业

  自我简介:

TA的其他文章


解题思路: 就是纯二分,用两次 第一次二分找到最大值,第二次二分找到最小值,输出就行了。不会二分的建议看下二分,一下就能明白这个题了

注意事项:

参考代码:

#include<bits/stdc++.h>
using namespace std;
int ans=0,setp,mina,maxn;        //ans为输入时 记录当前总的金属X的个数,setp 二分答案
int arr[10005]={0};
int main()
{
	int n,tmp;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i]>>tmp;
		ans+= tmp;
	}
	int l =0,r=1e+9;        //初始左右边界
	while(l+1<r)
	{
		setp =0;        //每次二分之前记得重置
		int mid = (r-l)/2 +l;
		for(int i=1;i<=n;i++)
		{
			setp += arr[i]/mid;    //统计当前mid的情况下 金属X的个数
		}
		if(setp >= ans)        //如果大于等于了,我们可以继续向右逼近,试探出l的最大值,也就是转化率最大
			l =mid;
		else r =mid;            //小于ans了,那肯定太小了,只能往左移动;
	}
	maxn = l;                //找出最大的值
	 l =0,r=1e+9;            //同样二分一下;
	while(l+1<r)    
	{
		setp =0;
		int mid = (r-l)/2 +l;
		for(int i=1;i<=n;i++)
		{
			setp += arr[i]/mid;
		}
		if(setp > ans)
			l =mid;    //一样的 大于了,就只能向右移动了;
		else r =mid;        //因为是找最小值,所以我们可以向左逼近,试探出最小值;
		}
	mina = r;
	cout<<mina<<" "<<maxn;
	return 0;
}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区