洛谷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 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...
随机推荐
- 第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024)
[ACM独立出版/Fellow大咖云集]2024年第二届机器人.人工智能与信息工程国际学术会议(RAIIE 2024) 2024 3rd International Symposium on Robo ...
- mybatis查询参数Set遍历查询
#sqlmapper <resultMap id="BaseResultMap" type="com.LogEntity" > <result ...
- 用CSS3绘制iPhone手机
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 用CSS3绘制iPhone手机 日期:2017-7-3 阿 ...
- 记录一次EF实体跟踪错误
记录一次EF实体跟踪错误 前言 在我写文章编辑接口的,出现了一个实体跟踪的错误,详情如下 System.InvalidOperationException: The instance of entit ...
- 【论文阅读】GRI: General Reinforced Imitation and its Application to Vision-Based Autonomous Driving
Column: December 30, 2021 11:01 PM Last edited time: January 10, 2022 4:45 PM Sensor/组织: 3 RGB; 曾经短暂 ...
- MySQL 获取所有表名、所有表结构
获取所有表名 SELECT A.TABLE_SCHEMA '数据库', A.TABLE_NAME '表名', A.TABLE_ROWS '表记录行数', A.CREATE_TIME '创表时间', A ...
- Dawwin首位人工智能编程师,未来又会怎么样?
Darwinai是一家快速发展的视觉质量检测公司,为制造商提供端到端解决方案,以提高产品质量并提高生产效率.该公司的专利可解释人工智能(XAI)平台已被众多财富500强公司采用,可以轻松集成值得信赖的 ...
- IDEA新手使用教程之使用技巧总结【详解】
IDEA是一款功能强悍.非常好用的Java开发工具,近几年编程开发人员对IDEA情有独钟. 一.IDEA的下载 IDEA下载地址:https://www.jetbrains.com/idea/down ...
- 探索Nuxt.js的useFetch:高效数据获取与处理指南
title: 探索Nuxt.js的useFetch:高效数据获取与处理指南 date: 2024/7/15 updated: 2024/7/15 author: cmdragon excerpt: 摘 ...
- PHP+Redis 实例【一】点赞 + 热度
前言 点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql(写了几百行的代码都还没写完,有毒)啦 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或m ...