有n个人想要去租单车,一共有m辆单车,首先一共有a元的公款,每个人还有自己的私款。
私款只能用在自己的单车上,问你一共最多能租下多少辆单车。
首先把单车价格和每个人的钱排序。
最大化可行解,二分找出最多能租的单车数目。
把价格最低的那些单车相加,减去公款数目就是最小花费。
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN=100010;
int b[MAXN];
int p[MAXN];
bool C(int x,int n,int m,int a){
int i=n-x,j=0;
for(;i<n&&j<m;i++,j++){
if(b[i]<p[j]){
a-=(p[j]-b[i]);
}
if(a<0)
break;
}
if(a>=0)
return true;
else
return false;
}
int main()
{
int n,m,a;
scanf("%d%d%d",&n,&m,&a);
for(int i=0;i<n;i++){
scanf("%d",b+i);
}
for(int i=0;i<m;i++){
scanf("%d",p+i);
}
sort(p,p+m);
sort(b,b+n);
int lb=0,ub=min(n+1,m+1);
while(ub-lb>1){
int mid=(lb+ub)>>1;
if(C(mid,n,m,a))
lb=mid;
else
ub=mid;
}
int r=lb;
if(r==0){
printf("0 0\n");
return 0;
}
long long sum=0;
for(int i=0;i<r;i++){
sum+=p[i];
}
printf("%d %I64d\n",r,sum>a?sum-a:0);
}