题意:给你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);
}
}