Time Limit: 1000 ms Memory Limit: 50 MBTotal Submission: 17 Submission Accepted: 6
Judge By Case
Description
神牛岛是传说中的一个岛屿,凡是成功到那里游历,完成探险并返回的人,都会成为神
牛。但是,现实中却没有人知道如何到达神牛岛。
这天夜里,笃志者睡着之后,不久就进入了梦乡。他突然看到有人在问,“有人想去神
牛岛的吗?”神牛岛之旅的牌子前,就开始有不少勇士报名要去冒险探索。
“我们会把勇士安排在前,带领大家一起去神牛岛。下面开始点名!”管理队伍的 LXY 神
牛说。其实说实话,给学生排队这种工作是最让神牛头疼的了。因为同学们都有自尊心,都
不愿意排后面。共有 n 个同学要排成一列,每个同学有两个属性:影响力和承受能力。给
一个同学造成的心理创伤指数等于所有在他前面同学的影响力之和减去他的承受能力。现在
请你帮忙安排一下点名顺序,尽量使受到心理创伤最大的同学少受创伤。
牛。但是,现实中却没有人知道如何到达神牛岛。
这天夜里,笃志者睡着之后,不久就进入了梦乡。他突然看到有人在问,“有人想去神
牛岛的吗?”神牛岛之旅的牌子前,就开始有不少勇士报名要去冒险探索。
“我们会把勇士安排在前,带领大家一起去神牛岛。下面开始点名!”管理队伍的 LXY 神
牛说。其实说实话,给学生排队这种工作是最让神牛头疼的了。因为同学们都有自尊心,都
不愿意排后面。共有 n 个同学要排成一列,每个同学有两个属性:影响力和承受能力。给
一个同学造成的心理创伤指数等于所有在他前面同学的影响力之和减去他的承受能力。现在
请你帮忙安排一下点名顺序,尽量使受到心理创伤最大的同学少受创伤。
Input
输入包含 n+1 行:
第 1 行是整数 n,表示同学的个数。
第 2~n+1 行每行两个自然数,分别是该同学的影响力和承受能力。
第 1 行是整数 n,表示同学的个数。
第 2~n+1 行每行两个自然数,分别是该同学的影响力和承受能力。
Output
输出包含 1 行,为你安排的顺序中受到心理创伤最大的同学受到的创
伤。
伤。
Sample Input
Original | Transformed |
3 10 3 2 5 3 3
3[EOL] 10[SP]3[EOL] 2[SP]5[EOL] 3[SP]3[EOF]
Sample Output
Original | Transformed |
2
2[EOL] [EOF]
Hint
【数据规模】
对于 100%的数据, 1<=n<=50000, 1<=影响力<=10000, 1<=承受能力<=1,000,000,000。
对于 100%的数据, 1<=n<=50000, 1<=影响力<=10000, 1<=承受能力<=1,000,000,000。
这题比赛的时候我是没办法,后面看汪神的推导,代码倒是不难
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
//#define DEBUG
const int maxn =50050,INF=1e9+1;
using namespace std;
struct lingfly {
long long x, y;
bool operator < (const lingfly& b)const {
return x + y < b.x + b.y;
}
};
lingfly a[maxn];
int main() {
#ifdef DEBUG
freopen("Text.txt", "r", stdin);
#endif // DEBUG
int n;
while (scanf("%d", &n) != EOF) {
int i, j;
long long sum = 0,ans=-INF;
for (i = 0; i < n; i++)
scanf("%lld %lld", &a[i].x, &a[i].y);
sort(a, a + n);
for (i = 0; i < n; i++) {
ans = max(ans, sum - a[i].y);
sum += a[i].x;
}
//cout << sum << endl;
//cout << a[n - 1].y << endl;
printf("%lld\n", ans);
}
return 0;
}