Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3192 | Accepted: 1260 |
Description
Input
Output
Sample Input
3 10 3 2 5 3 3
Sample Output
2
这题 - - 没怎么懂 转载一发题解 贪心真是弱啊
按照w+s贪心叠,越大的越在下面。如果最优放置时,相邻两头牛属性分别为w1,s1,w2,s2,第一头牛在第二头上面,sum为第一头牛上面的牛的体重之和,那么
第一头牛风险:a=sum-s1;第二头牛风险:b=sum+w1-s2;
交换两头牛位置之后 a'=sum+w2-s1,b'=sum-s2,
由于是最优放置,所以w2-s1>=w1-s2,即w2+s2>=w1+s1,所以和最大的就该老实的在下面呆着= =!
AC代码如下:
// // POJ 3045 Cow Acrobats // // Created by TaoSama on 2015-04-25 // Copyright (c) 2015 TaoSama. All rights reserved. // #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const int N = 1e5 + 10; int n; struct Cow { int w, s; bool operator < (const Cow& rhs) const { return w + s < rhs.w + rhs.s; } } a[50005]; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d%d", &a[i].w, &a[i].s); sort(a + 1, a + 1 + n); int ans = -INF, sum = 0; for(int i = 1; i <= n; ++i){ ans = max(ans, sum - a[i].s); sum += a[i].w; } printf("%d\n", ans); return 0; }