旅行家的预算

题目: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;
}
posted @ 2022-07-22 18:02  神佑我帅肖  阅读(153)  评论(0)    收藏  举报