#5
查看原帖
#5
690243
houluyu楼主2023/10/3 20:35

好好好第五个点没注意oil剩下的一直wa

看了

这个

可能错的不一样,但是注意到oil剩下的 一改一测数据,对了

/*
从当前开始
	1.能走到更便宜的,那加到最近的便宜点地方去 直接过去
	2.不能那走到能到的比较便宜的,直接过去
显然while循环要比for好 
都是正好搞完,不需要记录剩余油量 
*/
#include<iostream>
using namespace std;
double d1,c,d2,p,d[10],pr[10],ans;
int n;
int main()
{
	scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);//城市距离 油箱容量 每升距离 出发点价格 加油站数量 
	for(int i=1;i<=n;i++)
	{
		scanf("%lf%lf",&d[i],&pr[i]);
	}
	d[0]=0;
	pr[0]=p;
	d[n+1]=d1; 
	double max_=c*d2;
	for(int i=1;i<=n+1;i++)
	{
		if(d[i]-d[i-1]>max_)
		{
			printf("No Solution\n");
			return 0;
		}
	}
	double oil=0;//前面剩下的油 
	int now=0; 
	while(now<n+1)
	{
		int t=-1;
		for(int i=now+1;i<=n+1&&d[i]-d[now]<=max_;i++)//找能到达的,且价格更低 
		{
			if(pr[i]<pr[now])
			{
				t=i;
				break;//只找第一个剩下后面在处理 
			}
		}
		if(t==-1)//能到的地方找不到价格更低的 
		{//那就找比较低的
			double minx=114514.0;
			int minn;
			for(int i=now+1;i<=n&&d[i]-d[now]<=max_;i++)
			{
				if(pr[i]<minx)
				{
					minx=pr[i];
					minn=i;
				} 
			} 
			ans=ans+(c-oil)*pr[now]; 
			oil=c-(d[minn]-d[now])/d2;
			now=minn;
		}
		else//能找到就正好走到 
		{
			ans=ans+((d[t]-d[now])/d2-oil)*pr[now];
			oil=0;
			now=t;
		} 
//		cout<<ans<<" "<<now<< endl; 
	} 
	printf("%.2lf\n",ans);
	return 0;
} 

ans=ans+((d[t]-d[now])/d2-oil)*pr[now]; 这个-oil不能漏

2023/10/3 20:35
加载中...