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

注意事项:

参考代码:

#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论