AcWing 125. 耍杂技的牛
题意
奶牛叠罗汉, 这 N 头奶牛中的每一头都有着自己的重量 Wi 以及自己的强壮程度Si
写一个程序确定奶牛排序, 要使得它们的风险值中的最大值尽可能小
第 i 头奶牛的危险系数 = 当前上面所有奶牛的危险系数之和 - 第i头奶牛的强壮值
结论:
将奶牛按照 wi+si 进行升序排序, 风险系数一定是最小的
举个例子:给定的 Wi Si 为:1 10 32 2 53 3 3 没有排序的情况: Wi Si 危险系数1 10 3 -3 -> 0-32 2 5 5 -> 10-53 3 3 9* -> 12-3所以该序列的最终危险系数为 9排序的情况: Wi Si 危险系数1 3 3 -3 -> 0-3 2 2 5 -2 -> 3-53 10 3 2* -> 5-3所以该序列的最终危险系数为 2
所以, 从例子上就可以看出升序排序后所得的解是优于未排序的解的
证明:
我们可以先思考一下, 在排序前和排序后的关系? 如果把第 i 头牛和第 i+1 头牛交换, 会有什么样的影响?
我们要求的是让最大值尽可能最小, 也就要使得交换前大于交换后
序列: w₁s₁.., wᵢsᵢ, wᵢ₊₁sᵢ₊₁ ... wₙsₙ
第 i 头牛交换前的危险系数
第 i+1 头牛交换前的危险系数
第 i 头牛交换后的危险系数
第 i+1 头牛交换后的危险系数
因为每个式子前面的 sigma 的 1+...+i-1 是交集, 所以我们可以发现
"交换前后, 其他牛的危险值显然不变, 所以我们只要分析交换前后, 这两头牛的最大危险值即可"
化简后得到
第 i 头牛交换前
第 i+1 头牛交换前
第 i 头牛交换后
第 i+1 头牛交换后
将交换前后进行对比
ps: ∀wᵢ,sᵢ∈Z⁺因为题目的要求是最大值中风险值最小
即交换后的max(wᵢ₊₁-sᵢ, -sᵢ₊₁)(后)需要小于等于 交换前的max(−si, wᵢ-sᵢ₊₁)(前)第 i 头牛交换前后的对比: 前 后-sᵢ 和 wᵢ₊₁-sᵢ
两边同时加上一个sᵢ, 可以发现 wᵢ₊₁-sᵢ > -sᵢ第 i+1 头牛交换前后的对比: 前 后wᵢ-sᵢ₊₁ 和 -sᵢ₊₁
两边同时减去一个 sᵢ₊₁, 可以发现 wᵢ-sᵢ₊₁ > -sᵢ₊₁,即最大风险范围是 [wᵢ-sᵢ₊₁, wᵢ₊₁-sᵢ]
所以我们只要对比 wᵢ₊₁-sᵢ 和 wᵢ-sᵢ₊₁ 就行即可当 wᵢ-sᵢ₊₁ >= wᵢ₊₁-sᵢ 时, wᵢ+sᵢ >= wᵢ₊₁+sᵢ₊₁ 时, 交换后更优
当 wᵢ-sᵢ₊₁ < wᵢ₊₁-sᵢ 时, wᵢ+sᵢ < wᵢ₊₁+sᵢ₊₁ 时, 交换前更优所以们让按照 wᵢ+sᵢ 进行排序, 当存在逆序时就交换
然后更具题意算出每头牛的危险值记录其中最大值即可
先求出一个最大值, 因为要尽可能小, 所以交换后的最大值要小于交换前的最大值(题意), 然后就推出了最优的排序方案.
hh, 我是这么理解的
感觉有点像构造, 根据题意构造出来一个符合要条件的方案...比较菜, 如有错误希望大佬们可以指出
AC代码
#include <iostream>
#include <algorithm>#define fs first
#define sc second
using namespace std;const int MAXN = 50010;
typedef pair<int, int> pii;int n;
pii cow[MAXN];int main()
{cin >> n;for (int i = 0; i < n; ++ i){int w, s; cin >> w >> s;cow[i] = {w + s, w}; // 按照推出的结果排序}// 根据上文说法这样的排序是最优的sort(cow, cow + n);int res = -2e9, sum = 0;for (int i = 0; i < n; ++ i){int w = cow[i].sc, s = cow[i].fs - w;res = max(res, sum - s); // 之前牛的总重量 - 当前牛的强壮值 = 危险系数 sum += w; // wi-1 头牛的累加和}cout << res << endl;return 0;
}
AcWing 125. 耍杂技的牛相关推荐
- AcWing 125. 耍杂技的牛 (推公式)
AcWing 125. 耍杂技的牛 农民约翰的N头奶牛(编号为1..N1..N1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技. 奶牛们不是非常有创意,只提出了一个杂技表演: 叠罗汉,表演时, ...
- ACWing算法基础课-耍杂技的牛
1. 耍杂技的牛 题目链接: https://www.acwing.com/problem/content/description/127/ 参考文献 C++ 代码 #include <iost ...
- 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子
耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...
- 贪心——推公式——耍杂技的牛
农民约翰的 N 头奶牛(编号为 1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技. 奶牛们不是非常有创意,只提出了一个杂技表演: 叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠. ...
- AcWing 188. 武士风度的牛(BFS,C++)
AcWing 188. 武士风度的牛 题意 从一个起点遵循某种特殊规则走到终点,求最短的步数 分析 很显然,这题是bfs思想的应用. 1.首先输入数据,并在每次输入数据时判断起点和终点的坐标. 2.初 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
- MIT类人机器人开始耍杂技了,看这个后空翻它漂亮吗?
来源:机器之心本文约1500字,建议阅读5分钟最近,各式机器人可以说是十分火热了,机器人选手也可以后空翻了. 最近,各式机器人可以说是十分火热了.今年,腾讯发布了多模态四足机器人 Max,继 Max ...
- 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs
题目分析 来源:acwing 分析:bfs求最短步数,需要dist[]数组来记录最短步数. ac代码 #include<bits/stdc++.h> using namespace std ...
- 算法提高课-搜索-最短路模型-AcWing 188. 武士风度的牛 :bfs、dist数组记录最小步数
题目分析 来源:acwing 分析:马走日,这里用bfs遍历马的行走过程,输出到达终点的最小步数. 使用bfs求到每个点的最小步数,需要开一个dist[][]数组,来记录起点到某点的最小步数. 队列里 ...
最新文章
- 监控组策略应用---组策略建模
- c++ argmax
- StringUtils详解
- OSGI动态加载删除Service bundle
- 顺序表基本操作函数总结
- NeurlPS 2021论文预讲会议题全公开,4大主题和25场报告等你来
- VTK:可视化之CurvatureBandsWithGlyphs
- 用html编写ASCII表,HTML ASCII
- 手把手教我班小姐姐学java之方法重写与方法重载
- 隐藏在计算机网卡怎样删除,卸载电脑中隐藏虚拟网卡设备的解决方法
- c#进阶一:使用ILDASM来查看c#中间语言
- 燃气行业引入电子签章推动燃气销售合同线上签署
- html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
- 使用电位器控制LED灯的亮度
- 计算机未检测到任何网络硬件,电脑提示windows没有检测到任何网络硬件怎么办...
- 摄氏度符号英文计算机语言,英语符号
- Ntp校时客户端小工具
- 2020/10/22【ArcGIS】土地利用数据重分类与叠置分析-方法复盘
- 微信程序开发之微信接入(详细开发)
- 编程练习题 没答案版