题目描述
现在共有n个同学要排成一列,每个同学有两个属性:影响力和承受能力。给一个同学造成的心理创伤指数等于所有在他前面同学的影响力之和减去他的承受能力。请安排一下排队顺序,尽量使受到心理创伤最大的同学少受创伤。
数据范围:
对于100%的数据满足:1 ≤ n ≤ 50000, 1 ≤ 影响力 ≤ 10000, 1 ≤ 承受能力 ≤ 10^9.
输入描述
第1行是整数n,表示同学人数。
第2—n+1行,每行两个自然数,分别是该同学的影响力和承受能力。
输出描述
输出1行1个整数,为你安排的顺序中受到心理创伤最大的同学受到的创伤。
样例1
输入复制
3 10 3 2 5 3 3
输出
2
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
struct demo{int x, y;}s[50050];
bool cmp(demo x, demo y){
if(x.x + x.y < y.x + y.y) return 1;
if(x.x + x.y > y.x + y.y) return 0;
if(x.x < x.y) return 1;
return 0;
}
int main(){
scanf("%d", &n);
for(int i=1;i<=n;i++){
int x, y;
scanf("%d %d", &s[i].x, &s[i].y);
}
sort(s+1, s+n+1, cmp);
int tot = 0, ans = -2100000000;
for(int i=1;i<=n;i++){
ans = max(ans, tot-s[i].y);
tot += s[i].x;
}
printf("%d", ans);
return 0;
}