BZOJ1691: [Usaco2007 Dec]挑剔的美食家
贪心·mutiset
题解:
对于这种多元关系,比较套路的就是先将一维排序。因为我们要求最小花费,所以我们就按照花费排序,扫到每一个牧草,就将比它花费小的牛加进去,然后让它弹掉鲜美度小于等于它的最大一个即可。
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
const int N =200005;
multiset<int> s;
multiset<int>::iterator it;
int a[N],b[N],c[N],d[N],n,m,cnt;
long long ans;
pair<int,int> cow[N];
pair<int,int> food[N];
int main(){
freopen("a.in","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>cow[i].first>>cow[i].second;
for(int i=1;i<=m;i++) cin>>food[i].first>>food[i].second;
sort(cow+1,cow+1+n); sort(food+1,food+1+m);
for(int i=1,p=1;i<=m;i++){
while(p<=n && cow[p].first<=food[i].first){
s.insert(cow[p].second); p++;
}
if(s.empty()) continue;
it=s.upper_bound(food[i].second);
if(it==s.begin()) continue;
it--; s.erase(it);
cnt++; ans+=food[i].first;
}
if(cnt<n) puts("-1");
else cout<<ans<<endl;
}