首页 > 其他分享 >洛谷P1842 [USACO05NOV] 奶牛玩杂技

洛谷P1842 [USACO05NOV] 奶牛玩杂技

时间:2024-08-05 11:17:33浏览次数:6  
标签:压扁 洛谷 头牛 int USACO05NOV P1842 奶牛 力量 我们

[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;
}

总结:

贪心策略很多时候都是根据我们的直觉来得到思路的,但是我们有时并不能像这道题一样,给出严格的证明过程,但是我们当我们举不出任何反例时,我们就可以试试我们的贪心策略了!

总而言之,贪心策略很多时候都是我们的常识告诉我们应该这么做,只要我们举不出任何的反例,我们就可以尝试贪心策略,有时候我们也可以去尝试严格的数学证明我们的策略是正确的!

标签:压扁,洛谷,头牛,int,USACO05NOV,P1842,奶牛,力量,我们
From: https://www.cnblogs.com/Tomorrowland/p/18342856

相关文章

  • 洛谷P4910题解
    题目大意现在穿T次手串,每根手串的长度分别为不同的n,有木和金两种珠子,相邻两颗珠子必须有一个是金。题目思路分析我们现在设穿到第n个珠子时用金的方案数为f[1][n],用木的方案数为f[0][n]如果第n个珠子为金,那么前一颗珠子是什么都可以,因此f[1][n]=f[1][n-1]+f[0][n-1]而如果......
  • [简单] 树上的dfs & bfs_洛谷P5908 猫猫和企鹅
    题目链接https://www.luogu.com.cn/problem/P5908题目大意:\[\begin{align*}&给定n个点构成一颗树每条边val=1\\&求从根节点Root=1开始\quad其它所有点v到Root的距离\mathrm{dis(v,Root)}<=\mathrm{d}的点的数量\\\end{align*}\]思路:1.bfs队列跑一遍记录每个点的......
  • 【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar
    题目链接:P3398仓鼠找sugar-洛谷|(luogu.com.cn)题目大意:判定一棵树上的两条边是否相交Tag:[LCA][树上两点间距离的计算][如何判断与点在某条路径上]思路:\[\begin{align}&1.建图\\&2.\text{dfs}然后\计算出每个点的深度和计\text{anc}(i,j)\\&3.根据树上路径......
  • 超好玩洛谷小游戏大全,好玩到停不下来(用洛谷的人都必须要知道,程序猿、OIer必备)
    Game啊你颓废了快点这个<tuifei break>{\color{White}\colorbox{Pink}{<tuifeibreak>}}<tuifei b......
  • 洛谷 统计天数 + 语句解析 题解
    题目:P1567统计天数P1597语句解析第一道:P1567统计天数题目描述炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。经历千辛万苦,他收集了连续 N(1≤N≤10^6)天的最高气温数据。现在......
  • C++ 最小生成树 洛谷
    介绍:最小生成树是个啥?其实就像杨志一行人押送生辰纲。抛开最后生辰纲被抢的结局不谈,杨志他们需要到好几个地方,每个地方都需要花点过路费给梁山好汉们打点。比如下面就是一张城市地图:其中每两个图之间的路径长就是要给梁山好汉们打点的银子数。比如1号地点到2号地点的梁山好......
  • 洛谷P6786
    题目原题链接https://www.luogu.com.cn/problem/P6786题目描述小A有一个长度为n的序列a_1,a_2,...,a_n。他想从这些数中选出一些数b_1,b_2,...,b_k满足:对于所有i(1<=i<=k),b_i要么是序列b中的最大值,要么存在一个位置j使得b_j>b_i且b_i+b_j+g......
  • 洛谷P4554 小明的游戏
    小明的游戏题目描述小明最近喜欢玩一个游戏。给定一个n×m的棋盘,上面有两种格子#和@。游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。请编程计算从起始位置移动到目标位置的最小......
  • 洛谷 P1080 [NOIP2012 提高组] 国王游戏
    一道非常有挑战性的题目(~太难了~)。这题我们可以用贪心来做。思路:首先我们定义一个结构体struct,里面放的是每个人左手和右手的数字。接着我们需要一种排列方式,使得获得奖赏最多的大臣,所获奖赏尽可能的少;这句话听起来是不是听绕口?意思就是说得到奖赏数量最多,但加起来的总奖赏......
  • 洛谷-P3869 [TJOI2009] 宝藏
    Abstract传送门本题是状态压缩+记忆化BFS的典型例子。Idea要求从出发点到终点的最短步数,BFS自然是首选的方法,那么,如何构造搜索的每一个节点呢?考虑到机关的数量比较小,最多10种,我们可以考虑用状态压缩去描述机关当前的状态,然后再记录当前的横纵坐标,以及行走的步数即可。值得......