BZOJ 1629: [Usaco2007 Demo]Cow Acrobats

本篇介绍了一个有趣的算法问题,源自USACO竞赛,任务是通过排序和贪心策略来确定最佳的牛牛堆叠顺序,使得最危险的牛承受的风险最小。文章详细解释了解题思路,并给出了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1629: [Usaco2007 Demo]Cow Acrobats

Time Limit: 5 Sec   Memory Limit: 64 MB
Submit: 1009   Solved: 525
[ Submit][ Status][ Discuss]

Description

Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planningto run away and join the circus. Their hoofed feet prevent themfrom tightrope walking and swinging from the trapeze (and theirlast attempt at firing a cow out of a cannon met with a dismalfailure). Thus, they have decided to practice performing acrobaticstunts.The cows aren't terribly creative and have only come up with oneacrobatic stunt: standing on top of each other to form a verticalstack of some height. The cows are trying to figure out the orderin which they should arrange themselves within this stack.Each of the N cows has an associated weight (1 <= W_i <= 10,000)and strength (1 <= S_i <= 1,000,000,000). The risk of a cowcollapsing is equal to the combined weight of all cows on top ofher (not including her own weight, of course) minus her strength(so that a stronger cow has a lower risk). Your task is to determinean ordering of the cows that minimizes the greatest risk of collapsefor any of the cows.//有三个头牛,下面三行二个数分别代表其体重及力量//它们玩叠罗汉的游戏,每个牛的危险值等于它上面的牛的体重总和减去它的力量值,因为它要扛起上面所有的牛嘛.//求所有方案中危险值最大的最小

Input

* Line 1: A single line with the integer N.* Lines 2..N+1: Line i+1 describes cow i with two space-separated integers, W_i and S_i.

Output

* Line 1: A single integer, giving the largest risk of all the cows in any optimal ordering that minimizes the risk.

Sample Input

3
10 3
2 5
3 3

Sample Output

2

OUTPUT DETAILS:

Put the cow with weight 10 on the bottom. She will carry the other
two cows, so the risk of her collapsing is 2+3-3=2. The other cows
have lower risk of collapsing.

HINT

Source


题解:一看数据范围就是知道是贪心题,排个序就行了。于是磨磨蹭蹭地证了一下。假设我们必须把A放在B的上面。设A的重量和力量是w1,s1,B的是w2,s2。如果A在上面,B的危险值就是S+w1-a2.(其中S是之前的奶牛重量和)。如果A在下面,A的危险值就是S+w2-a1.因为A在B上面更优,所以S+w1-a2<=s+w2-a1,整理后可得:w1+a1<=w2+a2。因此,我们要把总和小的放在前面。。。



代码:

#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int w,s;}a[50005];
int n,sum,ans;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
bool cmp(node a,node b){return a.w+a.s<b.w+b.s;}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
		a[i].w=read(),a[i].s=read();
	sort(a+1,a+n+1,cmp);
	ans=-a[1].s;
	for(int i=1;i<=n;i++)
		sum+=a[i-1].w,ans=max(ans,sum-a[i].s);
	printf("%d",ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值