P1561 [USACO12JAN] Mountain Climbing S

Solution

简单看题容易得到一个错误的贪心:

\[ans=max\{\Sigma_{k=1}^n + down_{min}, \Sigma_{k=1}^n +up_{min}\} \]

然后你将可以把他 hack 掉,因为最初的方法认为第一个牛上山后,所有上下山是一起进行的,其实有可能出现不重叠的情况,于是少算了。

那么接下来就是正确的贪心方式:

  1. 可以分为两大类的奶牛,U > D 和 D > U

  2. 排序方式:

    · 第一类在第二类前面

    · 第一类中,按照U的升序排列

    · 第二类中,按照D的降序排列

  3. 模拟即可

容易发现,第一类在第二类前面,而且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;
}
posted @ 2025-10-29 00:08  LTC_Augenstern  阅读(5)  评论(0)    收藏  举报