题目链接。
分析:
自己写的时候是直接模拟的,但似乎训练指南上的解法更好。
偶的代码:

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int maxn = 1010; struct Job{ int b, j; }a[maxn]; int cmp(const Job &x, const Job &y){ return x.j > y.j; } int main(){ int n, cnt=0; while(cin>>n){ cnt++; if(n == 0) break; for(int i=0; i<n; i++) cin>>a[i].b>>a[i].j; sort(a, a+n, cmp); int ans = 0, t=0; for(int i=0; i<n; i++){ if(t < a[i].b){ ans += a[i].b - t; ans += a[i].j; t = a[i].j; } else{ t -= a[i].b; if(a[i].j > t){ ans += a[i].j - t; t = a[i].j; } } } cout<<"Case "<<cnt<<": "<<ans<<endl; } return 0; }
训练指南上的代码(并不是和书上一样,只是按着思路来写的):

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int maxn = 1010; struct Job{ int b, j; }a[maxn]; int cmp(const Job &x, const Job &y){ return x.j > y.j; } int main(){ int n, cnt=0; while(cin>>n){ cnt++; if(n == 0) break; for(int i=0; i<n; i++) cin>>a[i].b>>a[i].j; sort(a, a+n, cmp); int ans = 0, s=0; for(int i=0; i<n; i++){ s += a[i].b; ans = max(ans, s+a[i].j); } cout<<"Case "<<cnt<<": "<<ans<<endl; } return 0; }