https://www.acwing.com/problem/content/1229/
这个问题也是不好直接求值,但是给定值很好判定这个值是不是可以的,所以也可以用二分解决。
不过整数二分略微有点难写。
1 #include<iostream> 2 #include<climits> 3 using namespace std; 4 typedef pair<int,int> PII; 5 const int N=1e5+10; 6 PII a[N]; 7 int n,k; 8 bool check(int x){ 9 int res=0; 10 for(int i=0;i<n;i++){ 11 res+=(max(a[i].first,a[i].second)/x)*(min(a[i].first,a[i].second)/x); 12 } 13 return res>=k; 14 } 15 int main(void){ 16 cin>>n>>k; 17 int ma=INT_MIN; 18 for(int i=0;i<n;i++){ 19 cin>>a[i].first>>a[i].second; 20 ma=max(ma,a[i].first); 21 ma=max(ma,a[i].second); 22 } 23 int l=0,r=ma; 24 while(l<r){ 25 int mid=l+r+1>>1; 26 if(!check(mid)){ 27 r=mid-1; 28 }else{ 29 l=mid; 30 } 31 } 32 cout<<l<<endl; 33 return 0; 34 }