洛谷 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 }