[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