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


题目:约翰的奶牛对食物越来越挑剔了。现在,商店有M 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用。第i 份牧草的价格为Pi,口感为Qi。约翰一共有N 头奶牛,他要为每头奶牛订购一份牧草,第i 头奶牛要求它的牧草价格不低于Ai,口感不低于Bi。请问,约翰应该如何为每头奶牛选择牧草,才能让他花的钱最少?


题解:对奶牛的价格要求和草的价格要求进行排序,排序后可以得到如下:

\[\begin {align}
(A_1, B_1), (A_2, B_2), \cdots, (A_N, B_N),~A_i ≤ A_j, ~1 ≤ i < j ≤ N \\
(P_1, Q_1), (P_2, Q_2), \cdots, (P_M, Q_M),~P_i ≤ P_j, ~1 ≤ i < j ≤ M
\end {align}
\]

从第一项开始遍0历,若\((P_1, Q_1)\)可以使得\(A_x < P_1 < A_{x + 1}\),那么将\((B_1, 1), \cdots, (B_x, x)\)放入\(S\),因为这样可以将奶牛的需求按照品质排序,每次该牧草所给的奶牛的序号应该为\(t\),其中\(Q_t ≤ Q_1 < Q_{t + 1}\),即\(t = S.lower\_bound(Q_1) - 1\),但是我们会发现这存在问题,因为\(lower\_bound\)如果找不到,会定位在比\(Q_1\)大的那个数上,所以这里可以使用技巧:将\(S\)进行降序排序(原来是升序),只需要将每个数乘上\(-1\)即可取出来的时候也乘\(-1\)。对于其后考虑的牧草,可以发现\(P_i ≥ P_1\)(已经排好序了),所以在\(S\)中的奶牛只需要关心品质,无需关心价格。

综上所述我们可以发现是需要维护一个储存奶牛的\(multiset\),这其中在判断草是否可以用有一个技巧:直接使用迭代器\(std::multiset\text{<}int\text{>}::iterator~~iter = cow\_set.lower\_bound(Q_{i})\)。对于这个迭代器,由于放入集合中的是降序排列,我们只需要操作迭代器就可以确定一个草可不可以用。现在我们假设:一个草的品质低于现在集合中奶牛所需的最低品质,很显然这个时候返回的\(iter\)是不在集合当中的(因为默认找更大的一个),此时一定有\(iter == cow\_set.end()\)(根据\(end()\)的定义)。

代码:

#include <iostream>
#include <algorithm>
#include <set> using namespace std;
typedef long long ll; const int maxn = 100005; ll n, m;
pair<ll, ll> cow[maxn], grass[maxn];
multiset<ll> cow_set; int main() {
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 >> grass[i].first >> grass[i].second;
sort(cow + 1, cow + 1 + n);
sort(grass + 1, grass + 1 + m); ll ans = 0;
for (int grass_i = 1, cow_i = 0; grass_i <= m; grass_i ++) {
ll now_grass_cost = grass[grass_i].first;
ll now_grass_quality = grass[grass_i].second;
for (int i = cow_i + 1; i <= n && cow[i].first <= now_grass_cost; i ++) {
// 符号:将序排列
cow_set.insert(-cow[i].second);
cow_i ++;
}
set<ll>::iterator iter = cow_set.lower_bound(-now_grass_quality);
// 草品质达到
if (iter != cow_set.end()) {
cow_set.erase(iter);
ans += now_grass_cost;
}
}
// 如果还有牛剩下来 -> 这些牛的要求没有被满足 -> 答案为-1
if (!cow_set.empty()) ans = -1;
cout << ans << endl;
}

P2869 [USACO07DEC]美食的食草动物Gourmet Grazers的更多相关文章

  1. LG_2869_[USACO07DEC]美食的食草动物Gourmet Grazers

    题目描述 Like so many others, the cows have developed very haughty tastes and will no longer graze on ju ...

  2. [USACO07DEC]美食的食草动物Gourmet Grazers

    ---题面--- 题解: 首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛. 实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于 ...

  3. luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    先满足挑剔的 #include <algorithm> #include <iostream> #include <cstdlib> #include <cs ...

  4. Luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers (贪心,二分,数据结构优化)

    贪心 考场上因无优化与卡常T掉的\(n \log(n)\) //#include <iostream> #include <cstdio> #include <cstri ...

  5. POJ3622 Gourmet Grazers(FHQ Treap)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 881 Description Like s ...

  6. POJ 3622 Gourmet Grazers(贪心)

    [题目链接] http://poj.org/problem?id=3622 [题目大意] 给出一些物品拥有两个属性值,价格和精美程度 给出一些需求表示要求获得的物品两个属性值的两种属性下界, 一个物品 ...

  7. luogu 2869 挑剔的美食家

    Gourmet Grazers 传送门 题目大意 约翰的奶牛对食物越来越挑剔了.现在,商店有\(M\) 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第\(i\) 份牧草的价格为\(P_i ...

  8. POJ1058 The Gourmet Club

    题目来源:http://poj.org/problem?id=1058 题目大意:ACM城的美食俱乐部有16位成员.他们连续了当地的法国餐厅Chatrau Java来安排连续5天的晚餐.晚餐时他们每4 ...

  9. Hawk 1.2 快速入门2 (大众点评18万美食数据)

    本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...

随机推荐

  1. 【Ubuntu】查看端口占用及关闭

    1.查看已连接的服务端口 (ESTABLISHED) netstat有一个快捷键[ss] netstat -a ss -a 2.查看所有的服务端口(LISTEN,ESTABLISHED) netsta ...

  2. PyTorch深度学习:60分钟入门(Translation)

    这是https://zhuanlan.zhihu.com/p/25572330的学习笔记. Tensors Tensors和numpy中的ndarrays较为相似, 因此Tensor也能够使用GPU来 ...

  3. HTTP 安全头配置

    在本篇中,我将介绍常用的安全头信息设置,并对每个响应头设置给出一个示例. HTTP安全头说明 Content-Security-Policy 内容安全策略(CSP)常用来通过指定允许加载哪些资源来防止 ...

  4. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

  5. docker-管理数据

    管理Docker中的数据 默认情况下,在容器内创建的所有文件都存储在可写容器层中.这意味着: 当该容器不再运行时,数据不会持久存在,如果另一个进程需要,则可能很难从容器中获取数据. 容器的可写层紧密耦 ...

  6. Nginx流量复制

    1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...

  7. 手把手带你了解消息中间件(3)——RocketMQ

    一.RocketMQ简介   RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 二.RocketMQ架构   如图所示为R ...

  8. ORA-00903表名无效关于${}和#{}的使用

    相当于对数据 加上 双引号,$相当于直接显示数据 ${xxx}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击 但可以使用在from之后传入表名 {}占位符? where之后 防止注入

  9. Map2Shp软件字符编码解决方案——彻底杜绝Shape格式乱码

    在使用Shape文件时,如果里面有中文属性信息时,经常会遇到属性信息变为乱码.尤其是ArcGIS10.2.1之后,Esri改变了软件的默认字符编码规则,打开之前保存的Shapefile文件,总会不时遇 ...

  10. The command '/bin/sh -c unzip -o php-7.2.23-src.zip' returned a non-zero code: 1

    Dockerfile 内容 #centos7 nginx php redis inotify FROM centos:7 MAINTAINER INFOBIRD RUN yum -y update & ...