题面:
有 n 名同学参加学校组织的郊游活动,已知学校给这 n 名同学 的郊游总经费为 A 元,与此同时第 i 位同学自己携带了 Mi 元。为了方便郊 游,活动地点提供 B(≥n)辆自行车供人租用,租用第 j 辆自行车的价格为 Cj 元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管 理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多 有多少位同学能够租用到自行车。
解法:
本题采用二分法。对于区间[l, r],我们取中间点 mid 并判断租用到自行 车的人数能否达到 mid。判断的过程是利用贪心算法实现的。贪心策略:钱数从小到大排序,租车费用从小到大排序,后面多的人尽量去买前面便宜的。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100000;
int n,b,a,m[MAXN],c[MAXN];
inline bool check(int s)
{
int cost=0,i,j;
i=n-s+1;
j=1;
while(i<=n)
{
if(c[j]>m[i]) s+=c[j]-m[i];//s是所需费用
i++;
j++;
}
if(s<=a) return true;//如果小于经费a则可以
else return false;
}
int main()
{
cin>>n>>b>>a;
for(int i=1;i<=n;i++) cin>>m[i];
for(int i=1;i<=b;i++) cin>>c[i];
sort(m+1,m+n+1);
sort(c+1,c+n+1);
int l=0,r=n,ans;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}