1. 程式人生 > >hdu 1105 二分答案

hdu 1105 二分答案

二分答案,每次確定mid是第幾大的數,然後調整。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int maxn=50000;
long long n,k;
long long A[maxn],B[maxn];


long long Ca(long long x){
    long long f;
    long long ret1=0;
    for(int i=0;i<n;i++){
        f=x/A[i];
        if
(x%A[i]!=0) f++; if(B[n-1]>=f) ret1+=(n-(long long)(lower_bound(B,B+n,f)-B)); } return ret1; } int main() { cin>>n>>k; for(int i=0;i<n;i++){ cin>>A[i]>>B[i]; } sort(A,A+n); sort(B,B+n); long long l=A[0
]*B[0],r=A[n-1]*B[n-1],mid; while(l<=r){ mid=(l+r)/2; long long x=Ca(mid); if(x>=k){ l=mid+1; } else{ r=mid-1; } } cout<<l-1<<endl; return 0; }