解题思路: 就是纯二分,用两次 第一次二分找到最大值,第二次二分找到最小值,输出就行了。不会二分的建议看下二分,一下就能明白这个题了
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复