先上代码:
#include<iostream>
using namespace std;
int main(){
int n;
int vmin = 1,vmax = 1e9;
cin >> n;
while(n--){
int a,b;
cin >> a >> b;
vmin = max(vmin,a/(b+1)+1);
vmax = min(vmax,a/b);
}
cout << vmin << " " << vmax;
return 0;
}
思路:
这道题当然也可以用二分来做:
思路:
代码:
#include<iostream>
using namespace std;
int binary_search(int a,int b){
int l = 1,r = 1e9+1;
int m;
while(l<r){
m = l+r >> 1;
if(a/m > b)
l = m+1;
else
r = m;
}
return r;
}
int main(){
int n;
cin >> n;
int vmin = 1,vmax = 1e9;
while(n--){
int a,b;
cin >> a >> b;
vmin = max(vmin,binary_search(a,b));
vmax = min(vmax,binary_search(a,b-1)-1);
}
cout << vmin << " " << vmax;
return 0;
}
其中l,r边界需要注意,
因为我们将b-1,所以二分之中b可能等于0,导致B=0,有A/V = 0,如果V的范围还是和A一样1~1e9,不可能出现A/V = 0。所以此处V要比1e9取大一些。