其他分享
首页 > 其他分享> > [USACO2005OPEN]Expedition

[USACO2005OPEN]Expedition

作者:互联网

贪心+堆/优先队列

如果现在的油量能到达下一个加油站则继续走;否则就要加上之前走过的加油站中油最多没走过的加油站的油,如果前面的所有加油站都加过油了还不能到达下一个加油站输出 -1。

看到要求最大值,第一想到的肯定是 sort。但是!sort 被卡了。

那怎么办呢?这样一来,就想到了堆和优先队列。

#include <bits/stdc++.h>
using namespace std;
struct jyz {
    int wz, yl;
    bool operator<(const jyz& other) const
    {
        return yl < other.yl;
    }//重载运算符,比sort排序还快些
} s[10010];
priority_queue<jyz> q;
int cmp2(jyz x, jyz y)
{
    return x.wz < y.wz;
}
int main()
{
    int n, y, t = 0, x;
    scanf("%d", &n);
    for (int i = n; i >= 1; i--) {
        scanf("%d%d", &s[i].wz, &s[i].yl);
    }//这里倒序不用管
    scanf("%d%d", &x, &y);
    for (int i = 1; i <= n; i++) {
        s[i].wz = x - s[i].wz;
    }//算出离起点的距离
    s[n + 1].wz = x, s[n + 1].yl = 0;//记得算上终点
    sort(s + 1, s + 1 + (n + 1), cmp2);//输入可能是无序的,所以要排个序
    for (int i = 1; i <= n + 1; i++) {
        if (y < s[i].wz) {//到不了
            if (t == i - 1) {
                printf("-1");//前面的都加过了
                return 0;
            }
            while (y < s[i].wz) {
                if (t == i - 1) {
                    printf("-1");
                    return 0;
                }
                jyz p = q.top();
                t++;
                y += p.yl;
                q.pop();
            }//一直加到可以到达
        }
        q.push((jyz){ s[i].wz, s[i].yl });
    }
    printf("%d", t);
}

我这里用的是优先队列,如果不嫌麻烦也可以用堆来做。

标签:队列,Expedition,int,scanf,jyz,加油站,USACO2005OPEN,wz
来源: https://blog.csdn.net/weixin_62672940/article/details/122293510