原序列顺序:(w1,s1),(w2,s2),...,(wp,sp),(wp+1,sp+1),...,(wn,sn)(w_1, s_1), (w_2, s_2), ..., (w_p, s_p), (w_{p + 1}, s_{p + 1}), ..., (w_n, s_n)(w1,s1),(w2,s2),...,(wp,sp),(wp+1,sp+1),...,(wn,sn)
交换后顺序:(w1,s1),(w2,s2),...,(wp+1,sp+1),(wp,sp),...,(wn,sn)(w_1, s_1), (w_2, s_2), ..., (w_{p + 1}, s_{p + 1}), (w_{p}, s_{p}), ..., (w_n, s_n)(w1,s1),(w2,s2),...,(wp+1,sp+1),(wp,sp),...,(wn,sn)
排序规则:max(∑i=1p−1wi−si,∑i=1pwi−sp+1)<max(∑i=1p−1wi−sp+1,∑i=1p−1wi+wp+1−sp)\max(\sum_{i = 1}^{p - 1} w_i - s_i, \sum_{i = 1}^{p} w_i - s_{p + 1}) < \max(\sum_{i = 1}^{p - 1}w_i - s_{p + 1}, \sum_{i = 1}^{p - 1} w_i + w_{p + 1} - s_p)max(∑i=1p−1wi−si,∑i=1pwi−sp+1)<max(∑i=1p−1wi−sp+1,∑i=1p−1wi+wp+1−sp)
可以发现,每个式子里面都包含了 ∑i=1p−1wi\sum_{i = 1}^{p - 1} w_i∑i=1p−1wi
=max(−sp,wp−sp+1)<max(−sp+1,wp+1−sp)= \max(-s_p, w_p - s_{p + 1}) < \max(-s_{p + 1}, w_{p + 1} - s_p)=max(−sp,wp−sp+1)<max(−sp+1,wp+1−sp)
=(wp−sp+1)<(wp+1−sp)= (w_p - s_{p + 1}) < (w_{p + 1} - s_p)=(wp−sp+1)<(wp+1−sp)
=wp+sp<wp+1+sp+1= w_p + s_p < w_{p + 1} + s_{p + 1}=wp+sp<wp+1+sp+1
排序代码:return w[i] + s[i] < w[j] + s[j]
。
注意:POJ 题目不能使用 #include <bits/stdc++.h>
!
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 5e4 + 10;
typedef pair<ll, ll> P;
P a[N];
int comp(P a, P b) {
return a.first + a.second < b.first + b.second;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].first >> a[i].second;
}
sort(a + 1, a + n + 1, comp);
ll sum = 0, ans = -1e18;
for (int i = 1; i <= n; i++) {
ans = max(ans, sum - a[i].second);
sum += a[i].first;
}
cout << ans << "\n";
return 0;
}
敢于推导,敢于尝试,最后的胜利的果实就将会属于你!如有问题,还请指出,谢谢。