[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

思路:

本题我们刚拿到题,我们可以先进行模拟,我们可以定义一个结构体,存储奶牛的两个性质,力量和重量。一开始并没有什么太好的思路去计算最小的压扁指数,但是我们可以凭直觉猜想一下,我们要使得这一群牛当

中,被压得最扁的奶牛的压扁指数尽可能的小,那么我们是不是就是要让最扁的那头奶牛的上面的所有牛的体重之和尽可能的小,并且让这头牛的力量尽可能的大,对吧?所以说我们最低的压扁指数不仅仅与体重

有关,也与牛的力量有关,所以说我们在采取排序策略的同时,我们不能够仅仅根据体重或者是根据力量这一个元素来排序,我们一定要结合两个属性来排序,我们不妨猜想根据体重和力量的某种组合方式来进行

排序,可以是重量与力量之差来排序,也可以是力量与重量之和来排序,只要我们证明,我们以某种排序规则下得到的总压扁指数是最小的,那么我们就成功证明了我们方案的可行性,对吧?

贪心策略的证明:

  1. 我们不妨先猜想按照力量和重量之和来排序,力量与重量之和小的排前面,反之则排后面。那么我们就需要证明,在这种排序规则之下,我们得到的总压扁指数就是最小的总压扁指数

我们假设第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),刚好是上面的式子变形得到的,那么我们就成功证明了我们策略的可行性

  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] 奶牛玩杂技的更多相关文章

  1. 洛谷 题解 P1842 【奶牛玩杂技】

    本蒟蒻又双叒叕被爆踩辣! Solution: 我们先看数据,50000,那么O(n)或者O(n log(n))是可以过的,非严格O(n * sqrt(n))要卡卡常,说不定也可以过. 那么什么算法可以 ...

  2. 题解【[USACO05NOV]奶牛玩杂技】

    \[ \texttt{Description} \] 有 \(n\) 头牛,每头牛都有自己的体重 \(W_i\) 和力量 \(S_i\) . 将这 \(n\) 头牛摞在一起,每头牛的压扁指数定义为:压 ...

  3. 洛谷 P1842 奶牛玩杂技 题解

    P1842 奶牛玩杂技 题目背景 Farmer John 养了N(1<=N<=50,000)头牛,她们已经按1~N依次编上了号.FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团 ...

  4. [洛谷P1842] 奶牛玩杂技

    题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...

  5. p1842 奶牛玩杂技 题解

    感觉其他dalao讲的不是很明白啊,我这样的蒟蒻看不懂啊. 在luogu这个dalao遍地的地方我蒟蒻看个题解也不明白,我为跟我同病相怜的蒟蒻写一篇吧 其实真是不太明白,大部分题解都是只说 体重大的在 ...

  6. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...

  7. 洛谷P3088 挤奶牛

    传送门啦 这个题也是一个单调队列来优化的 $ dp $ ,我们考虑这个题,这个题让我们求出有多少奶牛会觉得拥挤,如果我们还像琪露诺那个题那样单纯用一次单调队列肯定是不行的,因为牛觉不觉得拥挤是受左右的 ...

  8. 【洛谷P2340】 奶牛会展

    \(奶牛会展\) 题目链接 由于智商之和或情商之和不能为负数,所以直接把智商+情商>0的奶牛加上是布星的 我们考虑背包,不妨将智商当做物品大小,将情商当做价值 我们要求 大小+价值 的最大值 \ ...

  9. 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...

  10. 洛谷——P2383 狗哥玩木棒

    P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...

随机推荐

  1. Spring源码——详细流程图(超详细)

    Spring源码流程图

  2. 从Purge机制说起,详解GaussDB(for MySQL)的优化策略

    本文分享自华为云社区<[华为云MySQL技术专栏]GaussDB(for MySQL) Purge优化>,作者:GaussDB 数据库. 在MySQL中,尤其是在使用InnoDB引擎时,P ...

  3. WPF/C#:在DataGrid中显示选择框

    前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的. 整体实现效果如下: 如果对此感兴趣,可以接下来看具体实现 ...

  4. TCP三次握手和四次挥手全过程

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立连接: SYN:同步标志.该标志仅在三次握手建立TCP连接时有效. ACK:确认标志.同时提示远端系统已经成功接收所有数据 ...

  5. js-对象创建

    哥被逼得要当全栈工程师,今天练习了下各种对象的创建方式.代码较多参考了https://www.cnblogs.com/ImmortalWang/p/10517091.html 为了方便测试,整合了一个 ...

  6. python基础-字符串str " "

    字符串的定义和操作 字符串的特性: 元素数量 支持多个 元素类型 仅字符 下标索引 支持 重复元素 支持 可修改性 不支持 数据有序 是 使用场景 一串字符的记录场景 字符串的相关操作: my_str ...

  7. 微信小程序day04基础加强

    一.自定义组件 1.1 组件的创建与引用 首先创建组件 然后我们组件的引用分为局部和全局引用 局部引用就是在当前页面能使用,在当前页面的json文件里面配置 全局引用同样的道理,注意跟page等是同级 ...

  8. SpringBoot可视化接口开发工具magic-api

    magic-api简介 magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller.Service ...

  9. 汇编语言--cpu的工作原理(寄存器)--手稿

    03

  10. weui weui-switch 开关取值,设置默认状态

    html <div class="weui-cell__ft"> <input class="weui-switch" type=" ...