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 cannon met with a dismal failure). Thus, they have decided to practice performing acrobatic stunts.

The cows aren't terribly creative and have only come up with one acrobatic stunt: standing on top of each other to form a vertical stack of some height. The cows are trying to figure out the order in which they should arrange themselves ithin 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 cow collapsing is equal to the combined weight of all cows on top of her (not including her own weight, of course) minus her strength (so that a stronger cow has a lower risk). Your task is to determine an ordering of the cows that minimizes the greatest risk of collapse for 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

Hint

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.

大体题意就是类似叠罗汉,不过一层只有一个,每只奶牛都有体重和力气,受到的重量w>力气s会有风险,求最小风险。
一开始想的是体重轻力气小的在上,交完发现WA了,最后猜测w和s相加排序,过了。
引用某大神的推导,证明:
设Di表示第i头奶牛的难受值,Wi表示第i头奶牛的体重,Si表示第i头奶牛的力量,令i,j相邻,且Wi+Si>Wj+Sj,设∑表示i和j上面的奶牛的重量之和

当i在j的上方时有

- Di=∑−Si


- Dj=∑+Wi−Sj


当j在i的上方时有

- Di=∑+Wj−Si


- Dj=∑−Sj


显然我们可以得到
③>①,②>④,②>③

这里面②最大,所以如果我们让i在j的上方最终答案一定不会更优,即证得此贪心策略的正确性。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct cow{
int w,p,sum;
};
int cmp(cow c1,cow c2)
{
return c1.sum<c2.sum;
}
cow c[50100];
int main()
{
int n;
//int w[10100],p[10100];
//memset(w,0,sizeof(w));
//memset(p,0,sizeof(p));
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&c[i].w,&c[i].p);
c[i].sum=c[i].p+c[i].w;
}
//int sum[10100];
sort(c,c+n,cmp);
int ans=-0x3f3f3f3f;
int sum=0;
for(int i=0;i<n;i++)
{
//ans+=c[i].p-c[i-1].w;
ans=max(ans,sum-c[i].p);
sum+=c[i].w;
}
printf("%d\n",ans);
}
return 0;
}

  

最新文章

  1. postgresql修改最大连接数
  2. mac 10.9 安装 gevent
  3. a标签中href的触发
  4. HBase Shell 常见操作
  5. NodeJS系列~目录
  6. hyperstart 容器创建流程分析
  7. SQL SERVER2005 的三种复制类型概述
  8. Maven测试
  9. Android VideoView简单播放视频
  10. Xhprof安装笔记(PHP性能监控)
  11. DestroyWindow
  12. gdb的user-define command
  13. 玩转Windows服务系列&mdash;&mdash;Windows服务小技巧
  14. 依法使用Linux,反对Linux国产化
  15. 结巴(jieba)中文分词及其应用实践
  16. Matlab怎么修改显示数值格式/精度/小数位数
  17. java数学函数Math类中常用的方法
  18. Leaflet API翻译
  19. 第二章 深入C#数据类型
  20. 关于datatables与jquerUI版本冲突问题

热门文章

  1. Bresenham画椭圆算法
  2. 关于PHP函数的操作
  3. 浅析Java RTTI 和 反射的概念
  4. Linux学习总结(七)—— CentOS软件包管理:脚本安装
  5. Luogu P3390 【模板】矩阵快速幂
  6. 【转】深入探讨 Java 类加载器
  7. 【Ubuntu 16】显示管理器lightdm
  8. CentOS7下搭建hadoop2.7.3完全分布式
  9. 你所不知道的 CSS 动画技巧与细节
  10. Java中&quot;==&quot; 和 equals 的区别