1033. To Fill or Not to Fill (25)

贪心,如果能到达下一个价格不高于当前的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值