P2869 [USACO07DEC]美食的食草动物Gourmet Grazers

题目描述

链接
Like so many others, the cows have developed very haughty tastes and will no longer graze on just any grass. Instead, Farmer John must purchase gourmet organic grass at the Green Grass Grocers store for each of his N (1 ≤ N ≤ 100,000) cows.

Each cow i demands grass of price at least Ai (1 ≤ Ai ≤ 1,000,000,000) and with a greenness score at least Bi (1 ≤ Bi ≤ 1,000,000,000). The GGG store has M (1 ≤ M ≤ 100,000) different types of grass available, each with a price Ci (1 ≤ Ci ≤ 1,000,000,000) and a greenness score of Di (1 ≤ Di ≤ 1,000,000,000). Of course, no cow would sacrifice her individuality, so no two cows can have the same kind of grass.

Help Farmer John satisfy the cows’ expensive gourmet tastes while spending as little money as is necessary.

约翰的奶牛对食物越来越挑剔了。现在,商店有M 份牧草可供出售,奶

牛食量很大,每份牧草仅能供一头奶牛食用。第i 份牧草的价格为Pi,口感为

Qi。约翰一共有N 头奶牛,他要为每头奶牛订购一份牧草,第i 头奶牛要求

它的牧草价格不低于Ai,口感不低于Bi。请问,约翰应该如何为每头奶牛选

择牧草,才能让他花的钱最少?

输入输出格式
输入格式:

  • Line 1: Two space-separated integers: N and M.

  • Lines 2…N+1: Line i+1 contains two space-separated integers: Ai and Bi

  • Lines N+2…N+M+1: Line i+N+1 contains two space-separated integers: Ci and Di

输出格式:

  • Line 1: A single integer which is the minimum cost to satisfy all the cows. If that is not possible, output -1.

输入样例#1:

4 7
1 1
2 3
1 4
4 2
3 2
2 1
4 3
5 2
5 4
2 6
4 4

输出样例#1:

12

看上去就是就是贪心,可是两个变量,很麻烦,能想办法变成一个变量吗?当然可以。
对两个cow、grass排序,口感大的在前面,口感相同的随意。。。
然后取出第 i 只牛,
1:找到所有口感大于等于这只牛所要求的口感的草,加入某数据结构结构S,发现S中口感似乎已经不重要了。
2:从S找出最便宜的,加入答案,并把它从S中删除。
重复1,2,当遍历到任意一头牛时,S中的所有草都是满足这头牛的口感要求的,所以S只需保存价格这一个参数,那么,支持插入、删除、查找的数据结构是????


#include<bits/stdc++.h>
using namespace std;
char buf[100000],*L=buf,*R=buf;
#define gc() L==R&&(R=(L=buf)+fread(buf,1,100000,stdin),L==R)?EOF:*L++;
template<typename T>
inline void read(T&x) {
    int flag=x=0;
    char ch=gc();
    while (ch<'0'||ch>'9')flag|=ch=='-',ch=gc();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=gc();
    if(flag)x=-x;
}
const int MAXN=1e5+10;
struct Node{
    int a,b;
    bool operator<(const Node&y)const{return b>y.b; }
}c[MAXN],g[MAXN];
int n,m;
int main() {
    freopen("in.txt","r",stdin);
    read(n),read(m);
    if(m<n){cout<<-1;return 0;}
    for(int i=0;i<n;++i)read(c[i].a),read(c[i].b);
    for(int i=0;i<m;++i)read(g[i].a),read(g[i].b);
    sort(c,c+n);
    sort(g,g+m);
    long long ans=0;
    multiset<int>tree;
    multiset<int>::iterator p;
    for(int i=0,j=0;i<n;++i){//遍历牛
        while(j<m&&g[j].b>=c[i].b)tree.insert(g[j++].a);//如果当前的草满足口感要求,加入
        p=tree.lower_bound(c[i].a);//已经满足口感了,查找满足价格的草
        if(p==tree.end()){//没找到
            cout<<-1;
            return 0;
        }
        else{
            ans+=*p;
            tree.erase(p);
        }
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
代码飞升_不回私信人...:别这样贬低自己,降低预期,放平心态,跟昨天的自己比。做好自己,反而会效率更高心态更好,加油兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务