旅行家的预算
题目:P1016 [NOIP1999 提高组] 旅行家的预算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
其实这题用dp挺合适的。
诶,但我偏不。
(其实是当时傻掉了QAQ)
用的dfs,贪心。
起点加满油,然后自己的最长行驶距离里寻找第一个价格比自己低的油站,若无,则寻找油价最低的油站。
再原来的油全退掉,换油,直到终点。
还有判断,不用说,是个人都会。
(虽然本蒟蒻就是在这儿出问题的)
好了,上代码
(严禁代码复制,共创美好洛谷)
#include<bits/stdc++.h>
#define maxn 55
using namespace std;
int n,f;
double ans=1e9,dis;
double c,di;
double d[maxn],prize[maxn],nd[maxn];
void dfs(int st,double o,double cost)
{
if(st>n)
{
if(ans>=cost)
ans=cost;
f=1;
return ;
}
if(c*di<nd[st])
return ;
double x2=0;
for(register int i=st;i<=n;i++)
{
x2+=nd[i];
if(di*c<x2)
break;
dfs(i+1,c-x2/di,cost+prize[st]*(c-o));
dfs(i+1,0,cost+max((double)0,prize[st]*x2/di-prize[st]*o));
}
return ;
}
int main()
{
cin>>dis>>c>>di>>prize[0]>>n;
for(register int i=1;i<=n;i++)
{
cin>>d[i]>>prize[i];
nd[i-1]=d[i]-d[i-1];
}
nd[n]=dis-d[n];
dfs(0,0,0);
if(f)
{
printf("%.2lf",ans);
}
else
{
cout<<"No Solution"<<endl;
}
return 0;
}

浙公网安备 33010602011771号