Pro
Sol
贪心题。对于每一个加油站,我们可以根据这个加油站的坐标来确定如果在路过这个加油站之后加满油,最远可以到哪,而我们在求最远可以到哪的时候也可以求出路过的这些加油站中价钱最低的那个。如果存在价钱最低的,并且不是我们当前在的这个加油站的话,我们就花钱买正好能到达最便宜的加油站的油。但如果我们就在最便宜的地方,那么我们在这里加满油,到下一个最便宜的位置。
这样的贪心策略就能使我们在到达最后的时候花费的油钱最少。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node {
long long opt , val;
bool operator < (const Node &a) const {
return opt < a.opt;
}
};
Node map[50005];
long long n , res , to;
long long data[50005] , now = 0 , val , nxt , en;
long long find(long long s,long long lim)
{
long long noww=s+1,too=50003;
while(noww<=n)
{
if(map[noww].opt - map[s].opt > lim)
return too;
if(map[noww].val < map[s].val)
return noww;
if(map[noww].val < map[too].val)
too = noww;
noww++;
}
}
int main() {
scanf("%lld%lld%lld%lld",&n,&val,&res,&to);
for(long long i=1; i<=n; i++) {
scanf("%lld%lld",&map[i].opt,&map[i].val);
data[i] = map[i].opt;
}
sort(map+1 , map+n+1);
map[50003].val = 2e9;
if(map[1].opt > res || to - map[n].opt > val) {
printf("-1");
return 0;
}
sort(data+1 , data+n+1);
nxt = find(now , res);
if(nxt > n) {
printf("0");
return 0;
}
res -= map[nxt].opt;
now = nxt;
if(map[n].opt == n)
map[n].val = 0;
else {
n++;
map[n].opt = to;
map[n].val = 0;
}
while(now < n) {
nxt = find(now , val);
if(map[nxt].val > map[now].val) {
en += (val-res)*map[now].val;
res = val - map[nxt].opt + map[now].opt;
} else {
en += (map[nxt].opt - map[now].opt - res)*map[now].val;
res = 0;
}
now = nxt;
}
printf("%lld",en);
return 0;
}