洛谷 P1016 旅行家的预算(贪心+模拟)

题目链接:https://www.luogu.com.cn/problem/P1016

贪心的策略是:

从起点/其中一个加油站出发,所能到达的所有加油站中,如果有比当前加油站价格便宜的,则从当前加油站加定量油正好跑到那个最近的价格便宜的加油站;如果都比当前加油站贵,则加满油并跑到价格最低的一个。

再注意一些边界条件的处理。

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int N=10;
 5 double d1,c,d2,pp,len;
 6 int n;
 7 bool flag;
 8 double d[N],p[N];
 9 void DFS(int pos,double left,double cost,int pre){
10     if(pos==n+1){ printf("%.2lf",cost-left*p[pre]); flag=1; return;}
11     double _len=len+d[pos];
12     for(int i=pos+1;i<=n+1&&d[i]<=_len;i++){
13         if(p[i]<=p[pos]) { DFS(i,left,cost+double(d[i]-d[pos])/d2*p[pos],pos); return;}
14     }
15     if(pos+1<=n+1&&d[pos+1]<=_len){
16         int _pos=pos+1;
17         for(int i=pos+1;i<=n+1&&d[i]<=_len;i++){
18             if(p[i]<p[_pos]) _pos=i;
19         }
20         DFS(_pos,c-(d[_pos]-d[pos])/d2,cost+double(c-left)*p[pos],pos);
21         return;
22     }
23 }
24 int main(){
25     scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&pp,&n);
26     for(int i=1;i<=n;i++) scanf("%lf%lf",&d[i],&p[i]);
27     len=c*d2;
28     d[n+1]=d1;
29     p[0]=pp;
30     DFS(0,0,0,0);
31     if(!flag) printf("No Solution");
32     return 0;
33 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/13619312.html