AcWing 125. 耍杂技的牛

news/2024/9/18 22:08:11/文章来源:https://www.cnblogs.com/ltphy-/p/18419425

算法1

(贪心)

题目要求牛的最大伤害值最小,那么我们使每头牛的伤害值最小,在其中找最大值作为答案

如何使得每头牛的伤害值最小?

(1) 自身w值越大应该放到底部,使得被减数减小

(2) 自身s值越大应该放到底部,使得减数变大

综上,w + s 从小到大排序,最大的危险系数一定是最小的。

贪心算法的证明过程:

贪心所得到的解 == 最优解

(1)贪心所得到的解 >= 最优解

由于最终答案所有可行方案中的最大值,而用贪心得到的解是一个可行解,因此最优解一定大于贪心得到的解

(2)贪心得到的解 <= 最优解

假设最优解不是 w + s从小到达排序的,那么必然存在相邻两头牛,使得 $w_i$ + $s_i$ > $w_i+1$ + $si+1$

交换前的伤害值:

第i个位置上的牛:$ w_1 + w_2 + ... + w_~i-1 - s_i $

第i+1个位置上的牛:$ w_1 + w_2 + ... + w_i-1 + w_i - s_~ i + 1$

交换后的伤害值:

第i个位置上的牛:$ w_1 + w_2 + ... + w_~i-1 - s_~i+1 $

第i+1个位置上的牛:$ w_1 + w_2 + ... + w_~i-1 + w_i+1 - s_i$

由于交换前和交换后的式子当中都有$w_1 + w_2 + ... + w_i-1$,因此我们可以同时去掉他

再加上$s_i + s_i+1$

去掉w[1] + ...+w[i-1]之后:第i个位置上的牛      第i+1个位置上的牛交换前: -s[i]                w[i] - s[i + 1]交换后: -s[i + 1]            w[i+1] - s[i]----------
加上(s[i] + s[i+1])之后:第i个位置上的牛     第i+1个位置上的牛交换前: s[i+1]               w[i]+s[i]交换后: s[i]                 w[i+1]+s[i+1]

从上面的式子当中可以看出,$w_i + s_i > s_i$

又我们再前面假设当中 $w_i$ + $s_i$ > $w_i+1$ + $si+1$

因此,我们可以得出 (交换前)$s_i+1 + w_i + s_i $ 大于(交换后) $s_i + w_i+1 + s_i+1$

也就是说,交换后的值,严格变小了, 此时我们可以证明出贪心得到的值 <= 最优值

证毕!

C++ 代码

#include <bits/stdc++.h>
using namespace std;typedef pair<int,int>PII;
const int N = 50010;int n;
PII cow[N];int main(){scanf("%d",&n);for(int i = 0 ; i < n; i++){int w,s;scanf("%d%d",&w,&s);cow[i] = {w + s, w};   }//按照 w + s 从小到大进行排序sort(cow, cow + n);int ans = -2e9, sum = 0;   //sum表示当前我头上的牛的重量for(int i = 0; i < n; i ++){int w = cow[i].second, s = cow[i].first - w;  //当前牛的强壮值ans = max(ans, sum - s); //我头上的牛的总重量 - 我的强壮值sum += w;}printf("%d",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799564.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

?

CF1194G 在外层枚举\(x\)和\(y\),令\(x=x\times t,y=y\times t\),且\(x\times t\)十进制包含\(x\),\(y\)同理。 因为有进位,从低位向高位dp。 设\(f[T][0/1][0/1][i][j][0/1][0/1]\)表示处理到第T位,在当前这些为中\(x\times t\)是否大于\(n\),\(y\times t\)是否大于\(n\),…

网络补充

1. 网卡配置(ip,dns)目标:修改网卡的名字为eth0. 修改网卡配置文件,ip,dns,网关,子网掩码.(物理机,虚拟机(私有云)) 公有云自动获取即可,服务器数量巨大自动获取.1.1 网卡命名 结论: 工作有需求的时候再去修改. 做好记录,后面使用的时候参考即可. # 网卡命名规则: ens33 ensxxx…

在idea中使用mysql失败

在idea中测试mysql显示失败idea方面视图 - 工具窗口 - 数据库 或者右边有图标直接点开新建 - 数据源 - mysql名称 - 用户(root) - 密码 - 测试连接如果测试连接有切换相关提示直接点击, 如果出绿色对勾就成功了 到这里本可以结束了, 但是我最开始做的时候这个流程没有成功 以防…

Pyhton调用R语言rpy2包概要

随着深度学习、大数据和AI的发展,Python的热度持续上升,引发了关于选择Python还是R的讨论。作为数据分析工具,两者各有优缺点。在特定领域,如生态学,R仍被广泛应用,而Python则更多用于日常办公自动化,如批量处理文档和Excel。由于数据处理占用了我们大量时间,很多人希望…

自动驾驶运动规划学习_碰撞检测算法_GJK

自动驾驶运动规划学习:碰撞检测算法:GJK Gilbert–Johnson–Keerthi(GJK)算法,是一种用于检测两个凸集是否重叠的高效算法,并且可以得到两个凸集的最小距离.1.4.1 GJK算法原理1.4.1.1 闵可夫斯基差(Minkowski Difference)1.4.1.3 凸性 在二维空间中,如果一个凸集包含原点,…

设计模式之——代理模式

代理模式 前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做;再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法;再比如在淘宝上面买东西,你使用支付宝平台…

一文搞定WeakHashMap

写在前面 在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache,比如Google的Guava Cache,它支持数据定期过期、LRU、LFU等策略,但它…

P2710 数列/P2042 [NOI2005] 维护数列

题意(以 P2710 为例)思路 使用 FHQ-Treap 进行求解,清晰明了。对于 insert,先将要插入的数建成一棵树,然后将这棵树放入 FHQ-Treap 中。 对于 delete,将要删除的树分离出来,然后把剩下的部分合并即可,将删除的树的树根丢到废弃节点的栈中以备以后使用(节约空间,不然 …

扩展分析C语言单双引号、反斜杠与注释

目录注释奇怪的注释C风格的注释无法嵌套一些特殊的注释注释的规则建议反斜杠\反斜杠有续行的作用,但要注意续行后不能添加空格回车也能起到换行的作用,那续行符的意义在哪?反斜杠的转义功能单引号和双引号字面值,字符串,字符,字符变量的大小为什么sizeof(1)的大小是4 ?char…

扩展分析单双引号、反斜杠与注释

目录注释奇怪的注释C风格的注释无法嵌套一些特殊的注释注释的规则建议反斜杠\反斜杠有续行的作用,但要注意续行后不能添加空格回车也能起到换行的作用,那续行符的意义在哪?反斜杠的转义功能单引号和双引号字面值,字符串,字符,字符变量的大小为什么sizeof(1)的大小是4 ?char…

C----函数递归之反汇编

环境 win10 vc6.0 debug 代码 关于求阶层问题:n!=n(n-1)!;(n-1)! = (n-1)(n-2)! 例如5!=5(4)! 4!=43! 3!=32! 2!=21 函数递归的出口是1,所以函数递归最重要的条件是去寻找递归的出口 int fun(int i) {int sum = 0;if (i == 1){return 1;}else{sum = i*fun(i-1);}return sum …

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分,同时获取更精确的占…