解题思路: 就是纯二分,用两次 第一次二分找到最大值,第二次二分找到最小值,输出就行了。不会二分的建议看下二分,一下就能明白这个题了
注意事项:
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复