【刷水-贪心】BZOJ1629-[Usaco2007 Demo]Cow Acrobats

【题目大意】

有n个头牛,给出体重和力量。每个牛的危险值等于它上面的牛的体重总和减去它的力量值,求所有方案中危险值最大值的最小值。

【思路】

贪心。一开始脑补的贪心是体重大的先放下面,体重相同的根据力量值来排。但是其实是不对的QAQ

这里有详细证明:

首先要想到,对于相邻的两头牛,交换它们的位置,仅仅会影响他们两个的risk值 然后,对于最优系列的相邻的两头牛 w1 s1 w2 s2 最顶上的那头的顶上的牛的质量和为sum。

那么第一头牛的risk就是 sum - s1……r1

第二头的为sum + w1 - s2……r2

假如交换位置之后:

sum - s2……r3

sum + w2 - s1……r4

有:max(r1,r2) < max(r3,r4)——r1..r4分别对应四个risk。

那么,有四种假设。因为明显有 r1<r4,r2>r3 所以只剩下:

1.r1 < r3 &&( r1 > r2 && r3 > r4)

2.r2 < r4 && (r2 > r1 && r4 > r3)

对于1: s2 - s1 > w1 && s1 - s2 > w2,因为w1,w2都大于0,所以不符合。 所以只剩下2。

得到:w1 + s1 < w2 + s2 综上,得出w+s最大的必定在最底下,按照w+s排序得到的就是最优序列。 顺便,要注意一下,risk是可以为负数的,所以初始化的时候不可以为0。

唯一的坑点就是,ans的初始值要很小……因为可能risk都是负的。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int MAXN=50000+50;
 8 const int INF=1e9;
 9 struct node
10 {
11     int w,s;
12     bool operator < (const node &x) const
13     {
14         if (w+s<x.w+x.s) return 1;else return 0;
15     }
16 }cow[MAXN];
17
18 int main()
19 {
20     int n;
21     scanf("%d",&n);
22     for (int i=1;i<=n;i++) scanf("%d%d",&cow[i].w,&cow[i].s);
23     sort(cow+1,cow+n+1);
24     int sum=0,ans=-INF;
25     for (int i=1;i<=n;i++)
26     {
27         int now=sum-cow[i].s;
28         ans=max(ans,now);
29         sum+=cow[i].w;
30     }
31     printf("%d",ans);
32     return 0;
33 }
时间: 2024-12-19 22:09:38

【刷水-贪心】BZOJ1629-[Usaco2007 Demo]Cow Acrobats的相关文章

bzoj1629[Usaco2007 Demo]Cow Acrobats*

bzoj1629[Usaco2007 Demo]Cow Acrobats 题意: n头牛,每天牛都有体重与力量值.它们玩叠罗汉的游戏,每个牛的危险值等于它上面的牛的体重总和减去它的力量值,求所有方案中危险值最大的最小. 题解: 贪心.第i头牛比第j头牛高当且仅当i的重量-j的力量<j的重量-i的力量. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn

【BZOJ 1629】 [Usaco2007 Demo]Cow Acrobats

1629: [Usaco2007 Demo]Cow Acrobats Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 657  Solved: 331 [Submit][Status] Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet p

1629: [Usaco2007 Demo]Cow Acrobats

1629: [Usaco2007 Demo]Cow Acrobats Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1023  Solved: 531[Submit][Status][Discuss] Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofe

BZOJ 1629: [Usaco2007 Demo]Cow Acrobats

Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the trapeze (and their last attempt at firing a cow out of a ca

[USACO2007 Demo] Cow Acrobats

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1629 [算法] 贪心 考虑两头相邻的牛 , 它们的高度值和力量值分别为ax , ay , bx , by 我们发现 , 当ax + ay < bx + by时 , x排在前面比y排在前面更优 也就是说 , 当序列中有相邻的牛使得ax + ay >= bx + by时 , 可以通过交换两头牛使得答案更优 综上 , 按牛的(高度值 + 力量值)以关键字升序排序 , 即可 时间复杂度

[USACO2005][POJ3045]Cow Acrobats(贪心)

题目:http://poj.org/problem?id=3045 题意:每个牛都有一个wi和si,试将他们排序,每头牛的风险值等于前面所有牛的wj(j<i)之和-si,求风险值最大的牛的最小风险值 分析:这就是noip2012 T2的来源= =只不过这里是加,noip里是乘 不妨设所有牛都按最优顺序排好了,考虑相邻的两头牛i和i+1,如果交换他们的位置,那么对前面和后面的结果都无影响,只是他们两个的风险值变化了(变大了),于是我们可以得到这个时候i和i+1的关系 设w1+w2+...+wi-1

Cow Acrobats(贪心)

Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3686   Accepted: 1428 Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tig

BZOJ 1695 [Usaco2007 Demo]Walk the Talk 链表+数学

题意:链接 方法:乱搞 解析: 出这道题的人存心报复社会. 首先这个单词表-先上网上找这个单词表- 反正总共2265个单词,然后就考虑怎么做就行了. 刚开始我没看表,找不到怎么做,最快的方法我也只是想到了类n^6的做法. 然后我就卡关辣,这关怎么过! 神犇的方法是:观察表,发现规律: 发现表中的单词最长就是4个字母. 所以我们可以考虑求1,2,3,4长度的单词数. 1的话可以直接记录,扫的时候顺带加上就行. 然后神犇说了一句话: 表中长度为4的单词前两个字母相同的单词个数不超过35个. 长度为3

1638: [Usaco2007 Mar]Cow Traffic 奶牛交通

1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 618  Solved: 217[Submit][Status] Description 农场中,由于奶牛数量的迅速增长,通往奶牛宿舍的道路也出现了严重的交通拥堵问题.FJ打算找出最忙碌的道路来重点整治. 这个牧区包括一个由M (1 ≤ M ≤ 50,000)条单行道路(有向)组成的网络,以及 N (1 ≤ N ≤ 5,000)个