题解【[USACO05NOV]奶牛玩杂技】
\]
有 \(n\) 头牛,每头牛都有自己的体重 \(W_i\) 和力量 \(S_i\) 。
将这 \(n\) 头牛摞在一起,每头牛的压扁指数定义为:压在该牛上面的牛的体重之和 \(-\) 该牛力量 。
您需要找到一种摞牛方案,使得压扁指数最大的牛的压扁指数最小。
求这个压扁指数。
\]
- 微扰(邻项交换)证明贪心好题。
- 考虑任意一个摞牛方案,设该摞牛方案中,从顶端往底端数的第 \(i\) 头牛的体重为 \(W_i\) ,力量为 \(S_i\) 。
- 记 \(Z_i=\sum\limits_{j=1}\limits^{i}W_j\)(前 \(i\) 头牛体重和)。
- 我们考虑任意一个邻项,考虑交换,易得:
交换前第 \(i\) 头牛的压扁指数:\(Z_{i-1}-S_i\) 。
交换前第 \(i+1\) 头牛的压扁指数:\(Z_{i-1}+W_i-S_{i+1}\) 。
交换后第 \(i\) 头牛的压扁指数:\(Z_{i-1}-S_{i+1}\) 。
交换后第 \(i+1\) 头牛的压扁指数:\(Z_{i-1}+W_{i+1}-S_i\) 。
- 我们发现需要比较这两个式子的值:
\]
- 式子内部减去 \(Z_{i-1}\) ,得:
\]
- 式子内部加上 \(S_i+S_{i+1}\) ,得:
\]
- 注意到 \(W\) 为正整数,所以有 \(S_i \leq W_i+S_i\) ,\(S_{i+1} \leq W_{i+1}+S_{i+1}\) 。
- 也就是说当 \(S_{i+1} = \max(S_{i+1},W_i+S_i)\) 时,也定不会比 \(\max(S_i,W_{i+1}+S_{i+1})\) 大,另一式子同理。
- 故可以转化为比较这两个式子的值:
\]
- 当 \(W_i+S_i \leq W_{i+1}+S_{i+1}\) 时,上式 \(\leq\) 下式,则交换前定不比交换后优。
- 当 \(W_i+S_i \geq W_{i+1}+S_{i+1}\) 时,上式 \(\geq\) 下式,则交换后定不比交换前劣。
- 我们将满足 \(W_i+S_i > W_j+S_j\) ,\(i<j\) 的点对 \((i,j)\) 视为一个逆序对,显然,在任意局面下,增加逆序对的数量都不会使整体结果变优,减少逆序对的数量都不会使整体结果变差。
- 根据冒泡排序,在任意局面下,都可通过邻项交换使得该序列的逆序对数量变 \(0\) 。
- 也就是说,即使你的最优摞牛方案逆序对数量不为 \(0\) ,我也可以通过排序,使得在答案不更劣的情况下,使得逆序对数量为 \(0\) ,故逆序对为 \(0\) 时一定为最优方案。
- 当逆序对数量为 \(0\) 时,实际上就是将这 \(n\) 头牛以 \(W_i+S_i\) 为关键字从小到大排序。
- 至此我们就有一个贪心策略:将这 \(n\) 头牛以 \(W_i+S_i\) 为关键字从小到大排序。尽管这个贪心策略很玄学。
- 排好序,按题目描述说的一样算出答案即可。
- \(\mathcal{O(n \log n)}\) 。
\]
#include<cstdio>
#include<algorithm>
#define RI register int
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
const int N=50010;
int n;
struct Cow{
int W,S;
}a[N];
bool cmp(Cow a,Cow b)
{
return a.W+a.S<b.W+b.S;
}
long long ans=-0x3f3f3f3f;
int main()
{
n=read();
for(RI i=1;i<=n;i++)
a[i].W=read(),a[i].S=read();
sort(a+1,a+1+n,cmp);
long long sum=0;
for(RI i=1;i<=n;i++)
{
ans=max(ans,sum-a[i].S);
sum+=a[i].W;
}
printf("%lld\n",ans);
return 0;
}
\]
题解【[USACO05NOV]奶牛玩杂技】的更多相关文章
- 洛谷 P1842 奶牛玩杂技 题解
P1842 奶牛玩杂技 题目背景 Farmer John 养了N(1<=N<=50,000)头牛,她们已经按1~N依次编上了号.FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团 ...
- 洛谷 题解 P1842 【奶牛玩杂技】
本蒟蒻又双叒叕被爆踩辣! Solution: 我们先看数据,50000,那么O(n)或者O(n log(n))是可以过的,非严格O(n * sqrt(n))要卡卡常,说不定也可以过. 那么什么算法可以 ...
- p1842 奶牛玩杂技 题解
感觉其他dalao讲的不是很明白啊,我这样的蒟蒻看不懂啊. 在luogu这个dalao遍地的地方我蒟蒻看个题解也不明白,我为跟我同病相怜的蒟蒻写一篇吧 其实真是不太明白,大部分题解都是只说 体重大的在 ...
- [洛谷P1842] 奶牛玩杂技
题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...
- 题解 P4705 【玩游戏】
这题是真的神仙啊...居然用的 stl 来卡常? 话说 998244353 真的可以一眼 NTT ? noteskey 所以说只要推柿子就好了但是有的地方的推导根本就想不到... 我们令第 t 个答案 ...
- 钠 GZY整理贪心
目录 CF140C New Year Snowmen CF161B Discounts P1842 奶牛玩杂技 CF140C New Year Snowmen #include <bits/st ...
- 【USACO】电子游戏 有条件的背包
题目描述 翰的奶牛玩游戏成瘾!本来约翰是想把她们拖去电击治疗的,但是他发现奶牛们在玩游戏后生产 了更多的牛奶,也就支持它们了. 但是,奶牛在选择游戏平台上的分歧很大:有些奶牛想买 Xbox 360 来 ...
- usaco月赛,2017.1总结
T1:跳舞的奶牛 大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束.现 ...
- [LOJ 6030]「雅礼集训 2017 Day1」矩阵
[LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...
随机推荐
- JVM内存布局及GC知识
一.JVM运行时内存布局 按java 8虚拟机规范的原始表达:(jvm)Run-Time Data Areas, 暂时翻译为"jvm运行时内存布局". 从概念上大致分为6个(逻辑) ...
- jmeter连接数据库操作
JDBC Connection Configuration 数据库连接配置 数据库连接配置器,用来连接数据库,是一个连接池. 界面介绍 1.右键线程组->添加->配置元件->JDBC ...
- 机器学习-TensorFlow应用之classification和ROC curve
概述 前面几节讲的是linear regression的内容,这里咱们再讲一个非常常用的一种模型那就是classification,classification顾名思义就是分类的意思,在实际的情况是非 ...
- JS基础——ATM机终端程序编写(3.0)
利用函数进行代码实现,要点:将每一项操作单独写成一个函数,在需要时进行调用,弄清参数的传递. 创建模拟账户 使用数组创建账户 let user = ["xiaohei", 1234 ...
- 内网IP的解释
https://baike.baidu.com/item/%E5%86%85%E7%BD%91ip/8881186?fr=aladdin
- lua 中 . 和 : 的区别
lua 中 . 和 : 的区别 首先在lua中使用":"定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而&qu ...
- HTTP权威指南之URL与资源
前言 web基础中介绍了URI.URL与URN: URI是一类更通用的资源标识符,URL是它的一个子集: URI是一个通用的概念,它主要由URL与URN组成: URL是通过描述资源的位置来标识资源的, ...
- 开源镜像站-Android镜像
mirrors.neusoft.edu.cn www.opencas.org ubuntu.buct.edu.cn Android developer 最新国内镜像:http://wear.techb ...
- virtualenv 指定 python 解释器的版本
使用如下命令为 ubuntu 系统安装 virtualenv sudo apt-get install python-virtualenv 当我们使用 virtualenv 命令创建虚拟环境时,默认使 ...
- Codeforces_807
A. 严格按照题目给的两个条件来. #include<bits/stdc++.h> using namespace std; ],b[]; int main() { ios::sync_w ...