ZOJ 3278 8G Island【二分答案】

十分简单的一道二分答案了:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define red(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=1e5+5;
const ll Inf=1e18;

ll n,m,k,a[N],b[N];

bool check(ll x) {
	ll tot=0;
	
	rep(i,1,n) {
		ll l=1,r=m,ret=0;
		
		while(l<=r) {
			ll mid=l+r>>1;
			
			if(a[i]*b[mid]>=x) ret=mid,l=mid+1;
			else r=mid-1;
		}
		
		tot+=ret;
	}
	
	return tot>=k;
}

bool cmp(ll p,ll q) {
	return p>q;
}

int main() {
	while(~scanf("%lld%lld%lld",&n,&m,&k)) {
		rep(i,1,n) scanf("%lld",&a[i]);
		
		rep(i,1,m) scanf("%lld",&b[i]);
		
		sort(a+1,a+1+n,cmp);
		sort(b+1,b+1+m,cmp);
		
		ll l=a[n]*b[m],r=a[1]*b[1],ans=l;
		
		while(l<=r) {
			ll mid=l+r>>1;
			if(check(mid)) ans=mid,l=mid+1;
			else r=mid-1;
		}
		
		printf("%lld\n",ans);
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/83096280