P1016 旅行家的预算
链接:[Miku](https://www.luogu.com.cn/problem/P1016)'
贪心,对于每一个点,优先跑到能到的点中第一个价格较原点低的,否则加满油跑到价格最低的一个
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#define dou double
using namespace std;
dou d1,c,d2,pp;
int n;
dou d[7];
dou p[7];
dou v;
double x,y;
double ans=99999999.0;
void dfs(int pos,double co,double le,int f){
if(pos==n+1){
printf("%.2lf",co-le*p[f]);
exit(0);
}
dou vv=d[pos]+v;
for(int i=pos+1;i<=n+1&&d[i]<=vv;++i){
if(p[i]<=p[pos]){
dfs(i,co+double(d[i]-d[pos])/d2*p[pos],le,pos);
return ;
}
}
if(pos+1<=n+1&&d[pos+1]<=vv){
int ppp=pos+1;
for(int i=pos+1;i<=n+1&&d[i]<=vv;++i){
if(p[i]<=p[ppp]){
ppp=i;
}
}
dfs(ppp,co+double(c-le)*p[pos],c-(d[ppp]-d[pos])/d2,pos);
return ;
}
}
int main(){
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&pp,&n);
d[0]=0;
p[0]=pp;
v=c*d2;
for(int i=1;i<=n;++i){
scanf("%lf%lf",&d[i],&p[i]);
}
d[n+1]=d1;
dfs(0,0.0,0,0);
printf("No Solution");
return 0;
}