求助
查看原帖
求助
536154
吃蛋包饭的XNN楼主2023/10/2 09:11

大佬们谁帮我改一下代码 玄关 题目链接

#include<bits/stdc++.h>
using namespace std;

int n;
double d1,c,d2,p;
struct y{
	double jl;
	double yj;
}yz[10];

bool cmp(y a,y b){
	return a.jl<b.jl;
}

int main(){
	scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);
	for(int i=1;i<=n;i++){
		scanf("%lf%lf",&yz[i].jl,&yz[i].yj);
	}
	sort(yz+1,yz+1+n,cmp);
	//无法直接到终点且加油站数量为0或无法到达最近的加油站 
	if(c*d2<d1&&(n==0||c*d2<yz[1].jl)){
		printf("No Solution");
		return 0;
	}
	double wz=0,dqyj=p,fy=0,dqyl=0; 
	while(wz!=d1){
		int flag=0;
		double minn=1e9+7;
		//如果能到一个油价比目前低的加油站 就直接去
		for(int i=1;i<=n;i++){
			if(wz+d2*c>=yz[i].jl&&wz<yz[i].jl)minn=min(minn,yz[i].yj);
			if(wz+d2*c>=yz[i].jl&&wz<yz[i].jl&&yz[i].yj<=dqyj){
				
				if(dqyl>=(yz[i].jl-wz)/d2){//先用油箱里的油 
					dqyl-(yz[i].jl-wz)/d2;
				}
				else{
					fy+=((yz[i].jl-wz)/d2-dqyl)*dqyj;//用完油箱 
					dqyl=0;
				}
				dqyj=yz[i].yj;
				wz=yz[i].jl;
				flag=1;
			}
		}
		//不能去比当前更便宜的 则当前为最便宜 直接判断是否能到终点
		if(wz+c*d2>=d1){
			fy+=(d1-wz)/d2-dqyl;
			printf("%.2lf",fy);
			return 0;
		}
		//不能 则灌满当前油箱 到能到的最便宜的加油站再继续考虑 
		if(flag==0){
			fy+=(c-dqyl)*dqyj;
			dqyl=c;
			for(int i=1;i<=n;i++){
				if(yz[i].yj=minn){
					flag=1;
					dqyl-=(yz[i].jl-wz)/d2;
					dqyj=yz[i].yj; 
				}
			}
		}
		//没加油站且到不了终点 
		if(flag==0){
			printf("No Solution");
			return 0;
		}
		
	}
	return 0;
} 
2023/10/2 09:11
加载中...