贪心,如果能到达下一个价格不高于当前的gas station,则买油到该station,否则买最大值
注意:有一个测试点是出发点没有gas station
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <cstdio> #include <cstdlib> int c,d,avg,n; typedef struct{ float price; int dist; }gas; gas g[501]; int cmp(const void *a1,const void * a2){ return ((gas *)a1)->dist-((gas *)a2)->dist; } int leftdist=0; //剩下可以行驶的距离 float cost=0; int maxdist; int arrive=0; //0表示可以到达终点,否则为最远距离 void drive(int i){ if(i>=n) return; if(g[i+1].dist-g[i].dist>maxdist){ arrive=g[i].dist+maxdist; return; } int d=0; int j; for(j=i+1;j<=n;j++){ //寻找下一个gas station if(g[j].dist-g[i].dist>maxdist){ d=maxdist; j--; break; } else if(g[j].price<=g[i].price){ d=g[j].dist-g[i].dist; break; } } cost+=(float)(d-leftdist)/(float)avg*g[i].price; leftdist=d-(g[j].dist-g[i].dist); drive(j); } int main(){ scanf("%d%d%d%d",&c,&d,&avg,&n); maxdist=c*avg; for(int i=0;i<n;i++){ scanf("%f%d",&g[i].price,&g[i].dist); } g[n].dist=d;g[n].price=0.0; qsort(g,n,sizeof(gas),cmp); if(g[0].dist){ //出发点没有station printf("The maximum travel distance = 0.00"); return 0; } drive(0); if(arrive) printf("The maximum travel distance = %.2f",(float)arrive); else printf("%.2f",cost); return 0; } |