欧某上分之路——笔记走起,又收获一个!
小王子说:隔一天也不错!
点击下面链接直达:
题目描述:
代码:
法1:
#include <iostream>
using namespace std;
int get_l(int a,int b)
{
int l = 1 , r = 1e9;
while(l<r)
{
int mid = l+r>>1;
if(a/mid<=b) r = mid;
else l = mid+1;
}
return l;
}
int get_r(int a,int b)
{
int l = 1 , r = 1e9;
while(l<r)
{
int mid = l+r+1>>1;
if(a/mid>=b) l = mid;
else r = mid-1;
}
return r;
}
int main()
{
int n;
cin >> n;
int v_min = 1 , v_max = 1e9;
while(n--)
{
int a,b;
cin >> a >> b;
v_min = max(v_min,get_l(a,b));
v_max = min(v_max,get_r(a,b));
}
cout << v_min << ' ' << v_max << endl;
return 0;
}
总结:
- 通过二分法去找,最大和最小的V
- 题目要找Vmin和Vmax,所以用两个二分法找,同时用max() 和min()找
- 并且Vmin 要取最大的值 ,Vmax要去最小的值
这是求最小值l模板
while (l < r) {
int mid = (r + l) / 2;
if (check(mid) ) {
r = mid;
} else {
l = mid + 1;
}
} //如果 v<=3 那么 r=mid ,否则 l就 l=mid+1;其中第一个check相当于 a/mid<=b ,r=mid 意味着mid较大,并且check成立!
所以就是小于等于b —— <=b才成立
这是求最大值模板
while (l < r) {
int mid = (r + l + 1) / 2;
if (check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}//同理找最大l