Greedy:Cow Acrobats(POJ 3045)

题目大意:一群牛想逃跑,他们想通过搭牛梯来通过,现在定义risk(注意可是负的)为当前牛上面的牛的总重量-当前牛的strength,问应该怎么排列才能使risk最小?
说实话这道题我一开始给书上的二分法给弄懵了,后来看了一下题解发现根本不是这么一回事,其实就是个简单的贪心法而已。
这题怎么贪心呢?就是按w+s从小到大排序就好了,证明一下:
1.先证明如果不满足w+s的序列性,无论谁在谁的上面,都会违反题设:(设A在B的上面)
如果 A.s+A.w<B.s+B.w
则如果B.s<m+A.w
则如果B在A的上面A.s<B.s+B.w-A.w=B.w+m
得证
2.再证明一下如果采用排序的确能让risk的最大值最小。
如果 A.s+A.w<B.s+B.w
①A在B的上面
riskA1=m-A.s riskB1=m+A.w-B.s
②B在A的上面
riskB2=m-B.s riskA2=m+B.w-A.s
所以riskA2>riskA1
另外riskB1-riskA2=A.w+A.s-B.w-B.s<0 所以riskA2>riskB1>riskB2
则违反后risk会产生一个比三个risk更大的数,不符合题意
参考http://poj.org/showmessage?message_id=341726
#include <iostream>
#include <algorithm>
#include <functional> using namespace std;
typedef long long LL_INT; typedef struct _cows
{
LL_INT strength;
LL_INT weight;
bool operator<(const _cows &x) const
{
return strength + weight > x.weight + x.strength;
}
}Cows; static Cows cows_set[];
void Search(const int, LL_INT);
bool judge(const LL_INT, const int,const LL_INT); int main(void)
{
int sum_cows;
LL_INT sum_w; while (~scanf("%d", &sum_cows))
{
sum_w = ;
for (int i = ; i < sum_cows; i++)
{
scanf("%lld%lld", &cows_set[i].weight, &cows_set[i].strength);
sum_w += cows_set[i].weight;
}
sort(cows_set, cows_set + sum_cows);
Search(sum_cows,sum_w);
}
return ;
} void Search(const int sum_cows, LL_INT sum_w)
{
LL_INT ans = -; for (int i = ; i < sum_cows; i++)
{
sum_w -= cows_set[i].weight;
ans = max(ans, sum_w - cows_set[i].strength);
}
cout << ans << endl;
}
其实这题的思想和Protecting Flowers那题有点像,都是只看两个元素之间的两个量之间的练联系,而不只是单单的一个量

Greedy:Cow Acrobats(POJ 3045)的更多相关文章
- POJ 3045 Cow Acrobats (贪心)
POJ 3045 Cow Acrobats 这是个贪心的题目,和网上的很多题解略有不同,我的贪心是从最下层开始,每次找到能使该层的牛的风险最小的方案, 记录风险值,上移一层,继续贪心. 最后从遍历每一 ...
- 【POJ - 3045】Cow Acrobats (贪心)
Cow Acrobats Descriptions 农夫的N只牛(1<=n<=50,000)决定练习特技表演. 特技表演如下:站在对方的头顶上,形成一个垂直的高度. 每头牛都有重量(1 & ...
- POJ3045 Cow Acrobats —— 思维证明
题目链接:http://poj.org/problem?id=3045 Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 【POJ3045】Cow Acrobats(贪心)
BUPT2017 wintertraining(16) #4 B POJ - 3045 题意 n(1 <= N <= 50,000) 个牛,重wi (1 <= W_i <= 1 ...
- POJ 3045
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2302 Accepted: 912 Descr ...
- BZOJ1629: [Usaco2007 Demo]Cow Acrobats
1629: [Usaco2007 Demo]Cow Acrobats Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 601 Solved: 305[Su ...
- Cow Acrobats(贪心)
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3686 Accepted: 1428 Desc ...
- POJ3045 Cow Acrobats 2017-05-11 18:06 31人阅读 评论(0) 收藏
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4998 Accepted: 1892 Desc ...
- poj3045 Cow Acrobats (思维,贪心)
题目: poj3045 Cow Acrobats 解析: 贪心题,类似于国王游戏 考虑两个相邻的牛\(i\),\(j\) 设他们上面的牛的重量一共为\(sum\) 把\(i\)放在上面,危险值分别为\ ...
随机推荐
- hdu 4960 Another OCD Patient (最短路 解法
http://acm.hdu.edu.cn/showproblem.php?pid=4960 2014 Multi-University Training Contest 9 Another OCD ...
- UGUI事件解析
http://www.tuicool.com/articles/7fYjMr http://www.xuanyusong.com/archives/3325
- protobuf
1.下载地址:https://code.google.com/p/protobuf/downloads/list 安装 ./configure && make && m ...
- mysql索引优化
mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...
- C 语言sscanf
C语言以sscanf逗号作为分割符 ]={}; ]={}; ]={}; sscanf(],&buf_b[],&buf_b[]); printf("************** ...
- C 文件读写 容易疏忽的一个问题
今天需要解决一个问题,将影像瓦片(一堆jpg文件)分别进行读取,并将所有数据以文件流的方式存入一个.db的文件中, 同时将每个jpg数据在db文件中的位置保存下来,作为index存在.idx文件中. ...
- zabbix 3.0.4 Nginx 性能监控
搭建Nginx 安装pcre-devel .zlib-devel支持包 [root@test /]# yum -y install pcre-devel zlib-devel 创建nginx用户 [r ...
- [POJ1151]Atlantis
[POJ1151]Atlantis 试题描述 There are several ancient Greek texts that contain descriptions of the fabled ...
- PHP中函数sprintf .vsprintf (占位符)
sprintf()格式化字符串写入一个变量中. vsprintf()格式化字符串些写入变量中. <?php $num1 = 123; $num2 = 456; $txt = vsprintf(& ...
- Extjs TabPanel 选项卡延迟加载
Extjs TabPanel 选项卡延迟加载 说明: Ext中用到tabpanel选项卡控件, 选项卡页签默认是延迟加载的, 当用户手工切换到某页签下时该页签才会加载, 在页签没有加载前, 用户对该页 ...