BZOJ 1629 [Usaco2005 Nov]Cow Acrobats:贪心【局部证明】
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1332
题意:
有n头牛在“叠罗汉”。
第i头牛的体重为w[i],力量为s[i]。
一头牛的压扁程度 = 它上面所有牛的体重之和 - s[i]
所有牛的总压扁程度 = 所有牛中最大的那个压扁程度
问你总压扁程度最小为多少。
题解:
贪心。
套路:
选取最小的一个单元——相邻的两头牛,进行贪心策略的局部证明。
贪心策略:
假设最左边为顶部,最右边为底部。
从左往右分别编号0...n-1。
考虑两头相邻的牛:交换i和i+1两头牛。
压扁程度(交换之前):
i: a = sum - s[i]
i+1: b = sum + w[i] - s[i+1]
压扁程度(交换之后):
i: a' = sum + w[i+1] - s[i]
i+1: b' = sum - s[i+1]
显然:在交换之前,b为两者最大值;交换之后,a'为两者最大值。
假设未交换时为最优状态,则交换后不可能更优。
所以有:b < a'
即:sum + w[i] - s[i+1] < sum + w[i+1] - s[i]
整理得:s[i+1] + w[i+1] > s[i] + w[i]
所以贪心策略为:w+s值越大,越放在底下。
AC Code:
// before:
// i: sum - s[i]
// i+1: sum + w[i] - s[i+1]
// after:
// i+1: sum - s[i+1]
// i: sum + w[i+1] - s[i]
//
// f1 < f4 +w[i+1]
// f2 > f3 -w[i]
// w[i] - s[i+1] < w[i+1] - s[i]
// w[i+1] + s[i+1] > w[i] + s[i]
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 50005
#define INF 10000000 using namespace std; struct Cow
{
int w;
int s;
Cow(int _w,int _s)
{
w=_w;
s=_s;
}
Cow(){}
friend bool operator < (const Cow &a,const Cow &b)
{
return a.w+a.s<b.w+b.s;
}
}; int n;
Cow cow[MAX_N]; int main()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>cow[i].w>>cow[i].s;
}
sort(cow,cow+n);
int sum=;
int ans=-INF;
for(int i=;i<n;i++)
{
ans=max(ans,sum-cow[i].s);
sum+=cow[i].w;
}
cout<<ans<<endl;
}
BZOJ 1629 [Usaco2005 Nov]Cow Acrobats:贪心【局部证明】的更多相关文章
- bzoj 1629: [Usaco2007 Demo]Cow Acrobats【贪心+排序】
仿佛学到了贪心的新姿势-- 考虑相邻两头牛,交换它们对其他牛不产生影响,所以如果交换这两头牛能使这两头牛之间的最大值变小,则交换 #include<iostream> #include&l ...
- BZOJ 1629: [Usaco2007 Demo]Cow Acrobats
Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...
- [USACO2005][POJ3045]Cow Acrobats(贪心)
题目:http://poj.org/problem?id=3045 题意:每个牛都有一个wi和si,试将他们排序,每头牛的风险值等于前面所有牛的wj(j<i)之和-si,求风险值最大的牛的最小风 ...
- POJ 3045 Cow Acrobats (贪心)
POJ 3045 Cow Acrobats 这是个贪心的题目,和网上的很多题解略有不同,我的贪心是从最下层开始,每次找到能使该层的牛的风险最小的方案, 记录风险值,上移一层,继续贪心. 最后从遍历每一 ...
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )
直接floyd.. ---------------------------------------------------------------------------- #include<c ...
- Cow Acrobats(贪心)
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3686 Accepted: 1428 Desc ...
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
dp... dp( l , r , k ) , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...
- Bzoj 2058: [Usaco2010 Nov]Cow Photographs 题解
2058: [Usaco2010 Nov]Cow Photographs Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 190 Solved: 104[ ...
- 【BZOJ】1629: [Usaco2007 Demo]Cow Acrobats(贪心+排序)
http://www.lydsy.com/JudgeOnline/problem.php?id=1629 这题我想了很久都没想出来啊... 其实任意两头相邻的牛交换顺序对其它牛是没有影响的.. 那么我 ...
随机推荐
- Android开发第一讲之目录结构和程序的执行流程
1.如何在eclipse当中,修改字体 下面的这种办法,可以更改xml的字体 窗口--首选项--常规--外观--颜色和字体--基本--文本字体--编辑Window --> Preferences ...
- ORACLE物化视图具体解释
一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...
- 小白学习python之路(一):安装python3
引言 作为一个python小白,之前学的是java,不过听说python很流行,功能很强大,可以用很少的代码实现更强的功能,因此我也是被吸引了过来,并且把我的学习经历记录下来. 当然了,要学习 ...
- easyNetq demo
本demo包含一个类库,2个console程序 1.新建类库 MQHelper,控制台程序 consumer和proc ,控制台程序引用MQHelper 2.使用nuget安装easynwtq 和 ...
- 畅通project再续 HDU杭电1875 【Kruscal算法 || Prim】
Problem Description 相信大家都听说一个"百岛湖"的地方吧.百岛湖的居民生活在不同的小岛中.当他们想去其它的小岛时都要通过划小船来实现.如今政府决定大力发展百岛湖 ...
- IPv4(四)子网和子网掩码
为了完成路由选择,每个数据链路(网络)都必须有一个惟一的地址: 另外,数据链路上的每台主机也必须有一个地址,这个地址不仅标识主机为一个网络成员,还可以把主机与网络上的其他主机区分开来. 粗放使用IPv ...
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)
转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法 首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...
- spring boot json 首字母大小写问题解决方案
spring boot默认使用的json解析框架是jackson,对于.net转java的项目来说太坑了,首字母大写的属性会自动转为小写,然后前端就悲剧了,十几个属性的ViewModel增加几个Js ...
- C++刷题——2736: 指针练习--输出最大值
Description 採用指针法,输出10个整型数中的最大值和最小值 Input 10个整数 Output 最大值和最小值 Sample Input 2 6 3 8 1 5 7 0 4 9 Samp ...
- programming review (c++): (2)binary tree, BFS, DFS, recursive, non-recursive
1.二叉树定义 // Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *r ...