此题应用贪心和二分算法 此题分几步做
1.因为贵的房子不一定舒适所以应先排序舒适度(从大到小)
2.拥有金币数量的人排序(从穷到富)
3.想让舒适度最大应该让 买的起最大舒适度房子的人(前提条件)中最少金币持有者(能买的起房子中最穷的)先购买(用二分找);--原因:富的人选择多,防止有人买不起。
4.(起始结果设为0 ans=0;)将购买完的人从数组中删去,将买的人的舒适度结果加和;
5.输出结果;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n,m;
cin>>n>>m;
vector<ll>coin(n);
for(int i=0;i<n;i++)
{
cin>>coin[i];
}
sort(coin.begin(),coin.end());
vector<pair<ll,ll>>house(m);
for(int i=0;i<m;i++)
{
cin>>house[i].first>>house[i].second;
}
ll ans=0;
sort(house.rbegin(),house.rend());
for(int i=0;i<m;i++)
{
ll a=house[i].first;
ll b=house[i].second;
ll l=0;ll r=n-1;
while(l<=r)
{
ll mid=(l+r)/2;
if(coin[mid]>=b)
r=mid-1;
else
l=mid+1;
}
if(l<n)
{
ans+=a;
coin.erase(coin.begin()+l);
n--;
}
}
cout<<ans<<endl;
return 0;
}



京公网安备 11010502036488号