POJ 3045 Cow Acrobats

POJ 3045 Cow Acrobats

题意:给你n头牛叠罗汉,每头都有自己的重量w和力量s,承受的风险数就是该牛上面牛的总重量减去它的力量,题目要求设计一种堆叠方式使得所有牛里面风险最大的要最小。

思路:假设牛们已经堆叠好了,那么第 i 头牛要承受的风险就是r(i)=(w1+w2+...+w(i-1))-si,第i+1头牛需要承受的风险就是r(i+1)=(w1+w2+...+wi)-s(i+1)=r(i)+(wi+si)-s(i+1),把它俩交换下位置~~~则变成r'(i)=(w1+w2+...+w(i-1))-s(i+1),r'(i+1)=(w1+w2+...+w(i+1))-si。

r(i+1)<=r'(i+1) =>wi-s(i+1)<=w(i+1)-si => wi+si<=w(i+1)+s(i+1)

由上可知按w+s从小到大排序,排序完后从头往后遍历,记录最大值,风险最大的牛不一定在最后一个。

AC代码:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class cows{int w,s;}
public class Main
{
	static Scanner scan=new Scanner(System.in);
	
	public static void main(String[] args)
	{
		int n=scan.nextInt();
		cows ws[]=new cows[n];
		for(int i=0;i<n;i++)
		{
			ws[i]=new cows();
			ws[i].w=scan.nextInt();
			ws[i].s=scan.nextInt();
		}
		Arrays.sort(ws,new Comparator<cows>() {
			@Override
			public int compare(cows a,cows b)
			{
				return (a.w+a.s)>=(b.w+b.s)?1:-1;
			}
		});
		int sum=0,risk,ans=-0x7fffffff;
		for(int i=0;i<n;i++)
		{
			risk=sum-ws[i].s;
			if(risk>ans) ans=risk;
			sum+=ws[i].w;
		}
		System.out.println(ans);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值