题目:Codeforces 211 div2 D. Renting Bikes
tag :二分
思路:二分求出最大租车数mid,对于排序后的b,p,对应相减为:p[mid+1-i]-b[n+1-i]
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 100010
long long b[maxn],p[maxn],share;
int main()
{
int n,m;
long long share;
cin>>n>>m>>share;
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=m;i++)
cin>>p[i];
sort(p+1,p+m+1);
sort(b+1,b+n+1);
long long l=0,r=min(n+1,m+1),mid,ans=0;
int cas=100;
while(l<r && cas--)
{
mid=(l+r)/2;
bool ok=1;
long long res=0;
for(int i=1;i<=mid;i++)
{
if(b[n+1-i]<p[mid+1-i])
{
res+=p[mid+1-i]-b[n+1-i];
}
}
if(res<=share)
{
l=mid;
ans=mid;
}
else
{
r=mid;
}
}
cout<<ans;
long long miao=0;
for(int i=1;i<=ans;i++)
{
if(b[n+1-i]<=p[ans+1-i])
{
miao+=b[n+1-i];
share-=p[ans+1-i]-b[n+1-i];
}
else
miao+=p[ans+1-i];
}
cout<<" "<<max(0LL,miao-share)<<endl;
return 0;
}