BZOJ1691: [Usaco2007 Dec]挑剔的美食家

这篇博客介绍了如何使用贪心策略和mutiset数据结构来解决Usaco2007 December竞赛中的题目——挑剔的美食家。博主首先对问题进行分析,提出先按花费排序,然后依次将符合条件的牛加入,并移除不符合条件的最不鲜美的牛的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值