取消註釋, 看跑路過程!
貪心思路:
1. 優先前往油價比當前油價更低的油站,爲了前往這個油站,油箱裏的油要加最少(即跑到下一站油量恰好爲0),爲了能去那裏加更便宜的油
2. 沒有比當前油價低的油站時,則在能跑到的油站裏尋找價格最低的油站,但是這個最低的油站也比當前油站的價格高,所以要在當前油站把油加滿。
3. 如果滿油都到不了任意一個油站,那就說明到不了目的地,最遠到達當前油站座標+滿油箱能跑的距離
#include <iostream>
#include <algorithm>
using namespace std;
struct Station{
double price;
double dis;
};
bool cmp(Station a, Station b){
return a.dis < b.dis;
}
int main(){
double cap;
double dis;
double per;
int n;
scanf("%lf %lf %lf %d", &cap, &dis, &per, &n);
struct Station sta[n+1];
for(int i=0; i<n; ++i){
scanf("%lf %lf", &sta[i].price, &sta[i].dis);
}
sta[n].price = 0;
sta[n].dis = dis;
n++;
sort(sta, sta+n, cmp);
//printf("\n");for(int i=0; i<n; ++i){printf("%d %.2f %.2f\n",i,sta[i].dis, sta[i].price);}printf("\n");
if(sta[0].dis!=0){
printf("The maximum travel distance = 0.00\n");
return 0;
}
int now_sta = 0;
int next_sta = 0;
double V=0;
double money=0;
while(now_sta<n-1){
for(int i=now_sta; i!=n; ++i){
if(sta[i].dis-sta[now_sta].dis<=per*cap){
if(sta[i].price<sta[now_sta].price){
next_sta = i;
if( (sta[i].dis - sta[now_sta].dis)/per >= V){
//printf("當前車站%d 油箱剩餘油量%.3f 前往車站%d 油不夠,加油%.3f\n",now_sta,V,next_sta,(sta[i].dis - sta[now_sta].dis)/per - V);
money += ((sta[i].dis - sta[now_sta].dis)/per - V) * sta[now_sta].price;
V=0;
break;
}else{
//printf("當前車站%d 油箱剩餘油量%.3f 前往車站%d 油夠,要耗油%.3f\n",now_sta,V,next_sta,(sta[i].dis - sta[now_sta].dis)/per - V);
V -= (sta[i].dis - sta[now_sta].dis)/per;
break;
}
}
}else{
break;
}
}
if(next_sta == now_sta){
double min_price = std::numeric_limits<double>::max();
for(int i=now_sta+1; i<n; ++i){
if(sta[i].dis-sta[now_sta].dis<=per*cap){
if(sta[i].price < min_price){
next_sta = i;
min_price = sta[i].price;
}
}else{
break;
}
}
if(next_sta == now_sta){
printf("The maximum travel distance = %.2f\n", sta[now_sta].dis+per*cap);
return 0;
}else{
//printf("當前車站%d 油箱剩餘油量%.3f 前往車站%d 要加滿,加了:%.3f\n",now_sta,V,next_sta,50-(sta[next_sta].dis - sta[now_sta].dis)/per);
money += (cap - V) * sta[now_sta].price;
V = 50 - (sta[next_sta].dis - sta[now_sta].dis)/per;
}
}
//printf("%d %d\n",now_sta,next_sta);
now_sta = next_sta;
}
printf("%.2f\n",money);
return 0;
}