Solution
简单看题容易得到一个错误的贪心:
\[ans=max\{\Sigma_{k=1}^n + down_{min}, \Sigma_{k=1}^n +up_{min}\}
\]
然后你将可以把他 hack 掉,因为最初的方法认为第一个牛上山后,所有上下山是一起进行的,其实有可能出现不重叠的情况,于是少算了。
那么接下来就是正确的贪心方式:
-
可以分为两大类的奶牛,U > D 和 D > U
-
排序方式:
· 第一类在第二类前面
· 第一类中,按照U的升序排列
· 第二类中,按照D的降序排列
-
模拟即可
容易发现,第一类在第二类前面,而且U升序,接下来看第二类,下山慢的牛可以拖时间使得山顶没有牛而导致的浪费用时。
Code
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;
typedef long long ll;
struct node
{int x, y;
};
vector<node> cow;
node tmp;
bool cmp(node a, node b)
{if(a.x < a.y){if(b.x < b.y) return a.x < b.x;return true;}if(b.x >= b.y) return a.y > b.y;return false;
}
int n, up[25005], dwn[25005];
int main()
{IOS;cin >> n;for(int i = 1; i <= n; i ++) cin >> tmp.x >> tmp.y, cow.push_back(tmp);sort(cow.begin(), cow.end(), cmp);for(int i = 1; i <= n; i ++) up[i] = up[i - 1] + cow[i - 1].x;for(int i = 1; i <= n; i ++) dwn[i] = max(dwn[i - 1], up[i]) + cow[i - 1].y;cout << dwn[n];return 0;
}