洛谷P1842 [USACO05NOV] 奶牛玩杂技
[USACO05NOV] 奶牛玩杂技
题目背景
Farmer John 养了 \(N\) 头牛,她们已经按 \(1\sim N\) 依次编上了号。FJ 所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射出去,但可想而知,结果是悲惨的) 。最终,她们决定练习一种最简单的杂技:把所有牛都摞在一起, 比如说, 第一头牛站在第二头的身上, 同时第二头牛又站在第三头牛的身上...最底下的是第 \(N\) 头牛。
题目描述
每头牛都有自己的体重以及力量,编号为 \(i\) 的奶牛的体重为 \(W_i\),力量为 \(S_i\)。
当某头牛身上站着另一些牛时它就会在一定程度上被压扁,我们不妨把它被压扁的程度叫做它的压扁指数。对于任意的牛,她的压扁指数等于摞在她上面的所有奶牛的总重(当然不包括她自己)减去它的力量。奶牛们按照一定的顺序摞在一起后, 她们的总压扁指数就是被压得最扁的那头奶牛的压扁指数。
你的任务就是帮助奶牛们找出一个摞在一起的顺序,使得总压扁指数最小。
输入格式
第一行一个整数 \(N\)。
接下来 \(N\) 行,每行两个整数 \(W_i\) 和 \(S_i\)。
输出格式
一行一个整数表示最小总压扁指数。
样例 #1
样例输入 #1
3
10 3
2 5
3 3
样例输出 #1
2
提示
对于 \(100\%\) 的数据,\(1 \le N \le 5\times 10^4\),\(1 \le W_i \le 10^4\),\(1 \le S_i \le 10^9\)。
题目链接:https://www.luogu.com.cn/problem/P1842
思路:
本题我们刚拿到题,我们可以先进行模拟,我们可以定义一个结构体,存储奶牛的两个性质,力量和重量。一开始并没有什么太好的思路去计算最小的压扁指数,但是我们可以凭直觉猜想一下,我们要使得这一群牛当
中,被压得最扁的奶牛的压扁指数尽可能的小,那么我们是不是就是要让最扁的那头奶牛的上面的所有牛的体重之和尽可能的小,并且让这头牛的力量尽可能的大,对吧?所以说我们最低的压扁指数不仅仅与体重
有关,也与牛的力量有关,所以说我们在采取排序策略的同时,我们不能够仅仅根据体重或者是根据力量这一个元素来排序,我们一定要结合两个属性来排序,我们不妨猜想根据体重和力量的某种组合方式
来进行
排序,可以是重量与力量之差
来排序,也可以是力量与重量之和
来排序,只要我们证明,我们以某种排序规则下得到的总压扁指数是最小的,那么我们就成功证明了我们方案的可行性,对吧?
贪心策略的证明:
- 我们不妨先猜想按照力量和重量之和来排序,力量与重量之和小的排前面,反之则排后面。那么我们就需要证明,在这种排序规则之下,我们得到的总压扁指数就是最小的总压扁指数
我们假设第i头牛它的压扁指数是总压扁指数,那么它前面所有牛的总重量是\(w_1\)+\(w_2\)+....w(i-1),此时的总压扁指数为w1+w2+....+w(i-1)-si
,那么我们如何去证明这个压扁指数就是最小的呢?
我们可以试着交换任意两行奶牛,比如我们让第i头奶牛与第i-1头奶牛交换,那么此时的总压扁指数就变成了w1+w2+...wi-s(i-1)
,我们只需要证明 w1+w2+..w(i-1)-si<w1+w2+...+wi-s(i-1)
即可
由于我们是按照体重与力量之和来升序排列的,那么我们肯定就有w(i-1)+s(i-1)<wi+si
这个式子,观察上述不等式,只有wi,w(i-1),si,s(i-1)四个地方不一样,我们有w(i-1)+s(i-1)<wi+si
这个式子
两边移项以后可以得到w(i-1)-si<wi-s(i-1)
,刚好是上面的式子变形得到的,那么我们就成功证明了我们策略的可行性
- 其它的情况,例如按照重量与力量之差来升序排列,这种方式我们也是可以猜想的,我们也可也自行证明这个策略的可行性,如果我们能够证明我们当前策略的办法就是最优解,我们就可以采纳,不过这道题
在这种情况下,是不可取的,我们也可以自行证明一下。
代码:
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 5e4 + 10;
//用结构体来储存重量与力量两个属性
struct node {
int w;
int s;
}a[N];
int n;
//按照力量与重量之和来升序排列
bool compare(node A, node b) {
return A.w + A.s < b.w + b.s;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].w >> a[i].s;
}
sort(a + 1, a + 1 + n, compare);
//答案先最随便初始化为一个最小值
int res = -2e9;
int t = 0;
for (int i = 1; i <= n; i++) {
//结果取压扁指数的最大值
res = max(res, t - a[i].s);
t += a[i].w;
}
cout << res;
return 0;
}
总结:
贪心策略很多时候都是根据我们的直觉来得到思路的,但是我们有时并不能像这道题一样,给出严格的证明过程,但是我们当我们举不出任何反例时,我们就可以试试我们的贪心策略了!
总而言之,贪心策略很多时候都是我们的常识告诉我们应该这么做,只要我们举不出任何的反例,我们就可以尝试贪心策略,有时候我们也可以去尝试严格的数学证明我们的策略是正确的!
洛谷P1842 [USACO05NOV] 奶牛玩杂技的更多相关文章
- 洛谷 题解 P1842 【奶牛玩杂技】
本蒟蒻又双叒叕被爆踩辣! Solution: 我们先看数据,50000,那么O(n)或者O(n log(n))是可以过的,非严格O(n * sqrt(n))要卡卡常,说不定也可以过. 那么什么算法可以 ...
- 题解【[USACO05NOV]奶牛玩杂技】
\[ \texttt{Description} \] 有 \(n\) 头牛,每头牛都有自己的体重 \(W_i\) 和力量 \(S_i\) . 将这 \(n\) 头牛摞在一起,每头牛的压扁指数定义为:压 ...
- 洛谷 P1842 奶牛玩杂技 题解
P1842 奶牛玩杂技 题目背景 Farmer John 养了N(1<=N<=50,000)头牛,她们已经按1~N依次编上了号.FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团 ...
- [洛谷P1842] 奶牛玩杂技
题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...
- p1842 奶牛玩杂技 题解
感觉其他dalao讲的不是很明白啊,我这样的蒟蒻看不懂啊. 在luogu这个dalao遍地的地方我蒟蒻看个题解也不明白,我为跟我同病相怜的蒟蒻写一篇吧 其实真是不太明白,大部分题解都是只说 体重大的在 ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...
- 洛谷P3088 挤奶牛
传送门啦 这个题也是一个单调队列来优化的 $ dp $ ,我们考虑这个题,这个题让我们求出有多少奶牛会觉得拥挤,如果我们还像琪露诺那个题那样单纯用一次单调队列肯定是不行的,因为牛觉不觉得拥挤是受左右的 ...
- 【洛谷P2340】 奶牛会展
\(奶牛会展\) 题目链接 由于智商之和或情商之和不能为负数,所以直接把智商+情商>0的奶牛加上是布星的 我们考虑背包,不妨将智商当做物品大小,将情商当做价值 我们要求 大小+价值 的最大值 \ ...
- 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- 洛谷——P2383 狗哥玩木棒
P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...
随机推荐
- CentOS7学习笔记(七) 磁盘管理
查看硬盘分区信息 在Linux中使用lsblk命令查看硬盘以及分区信息 [root@192 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda ...
- HTML5 在泛在电力物联网的 10 大业务领域 2/3D 可视化应用
过去的 2018 年,我们认为是国内工业互联网可视化的元年,图扑软件作为在工业可视化领域的重度参与者,一线见证了众多 HTML5/Web 化.2D/3D 化的项目在工业界应用落地. 2019 年可以定 ...
- 在 AWS 平台搭建 DolphinScheduler
AWS平台搭建 DolphinScheduler DolphinScheduler 是当前热门的调度器,提供了完善的可视化.拖拉拽式的调度.在 AWS 平台上提供了 airflow 与 step fu ...
- 修改Git Commit提交记录的用户名Name和邮箱Email
修改Git 本次Commit提交记录的用户名Name和邮箱Email git commit --amend --author="new-name <xxx@new.com>&qu ...
- 【论文阅读】IROS2017: Voxblox & RAL2019: Voxblox++
IROS2017: Voxblox & RAL2019: Voxblox++ Status: Finished Type: RAL Year: 2019 组织/Sensor: ETH-ASL ...
- 在VisualStudio中WPF应用程序在打开窗体界面设计时报错<发生了未经处理的异常>的解决方法
在网上找了一个wpf的开源项目,在打开窗体,点击设计的时候,提示错误信息如下 System.Resources.MissingSatelliteAssemblyExceptionThe satelli ...
- pysnmp 获取设备 mib
snmpwalk 指令获取设备 mib snmpwalk -v 1 -c public ip .1 > ip.mibs pysnmp 获取设备 mib 安装环境 pip3 install pys ...
- JDK9之后 Eureka依赖
<!--Eureka添加依赖开始--> <dependency> <groupId>javax.xml.bind</groupId> <artif ...
- 基于JQ使用原生js构造一个自动回复随机消息的机器人
某些业务会使用到页面里存在一个机器人,类似于假客服一样,可以回复游客的问题. 那么如何自己写一个自动回复消息的机器人呢? 源码献上 /** * 基于jq的自动对话机器人 * @param {Objec ...
- redis基本数据结构-集合set
redis基本数据结构-集合set 特性 一个集合键最多存储 2^32 - 1 个字符串值 元素在集合内无序(哈希表-链地址法解决冲突) 元素在集合内唯一 向集合添加元素 sadd key value ...