题解【[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. 无解 ...
随机推荐
- java8 stream自定义分组求和并排序
public static void main(String[] args) { List<GroupDetailDTO> list = new ArrayList<>(); ...
- 关于Error executing aapt的问题
这两天装了ubuntu 14.0.4系统,在这个系统上装了eclipse的android开发环境.原以为一切顺利,结果开发环境装完导入工程后,工程提示有红叉. R文件不能自动生成,按R文件不能自动生成 ...
- C++ 引用分析
引用 左值引用,建立既存对象的别名 右值引用,可用于为临时对象延长生命周期 转发引用,保持函数实参的类别 悬置引用,对象生命周期已经结束的引用,访问改引用为未定义行为 值类别,左值,纯右值,亡值 st ...
- Browser Security-css、javascript
层叠样式表(css) 调用方式有三种: 1 用<style> 2 通过<link rel=stylesheet>,或者使用style参数. 3 XML(包括XHTML)可以通过 ...
- java异步调用方法
一.利用多线程 直接new线程 Thread t = new Thread(){ @Override public void run() { longTimeMethod(); } }; 使用线程池 ...
- 定义可选URL片段 定义自定义片段变量 精通ASP-NET-MVC-5-弗瑞曼
- idea搭建springmvc(maven版)
一.创建maven项目 (1)选择 file > new > project (2)填写对应信息,一路点击next 配置自己本地的maven,继续next 命名项目名(随意写,但要易懂), ...
- x01.auto_input: 自动输入
单位经常要把 excel 表的数据录入系统中,能够自动录入该多好. 花了几天时间,学习了一下 pandas 操作 excel 数据,利用 pyautogui 完成了一个自动录入的小测试,希望对有此需求 ...
- Java练习题1
题目1: 编程实现,现在有如下的一个数组: int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的 ...
- C语言创建文件夹
问题需求:在程序中需要使用文件夹时,一般可以先在程序目录或某一路径下创建一个文件夹,然后使用该文件夹. 这种方法比较麻烦,需提前创建文件夹. 使用C语言创建文件夹的代码可以如下: #include & ...