我哪写错了,求调
查看原帖
我哪写错了,求调
1279718
phigros_player楼主2024/10/7 14:24

密密麻麻的我也不知道哪错了,WA了

#include <bits/stdc++.h>
using namespace std;
/*首先来思考,当我在一个加油站时,我接下去要去另一个加油站,我选择哪一个?
线性地思考,一定是从当前位置找到的第一个比我价格低的那一个。
那为什么不去选择我能到达的范围中的最小的呢,一定是第一个呢。
思考:如果有一个价格更小的加油站在比我第一个更小的加油站后面,那么我的选择应该是从A->B->C,
而非是从A->C,所以选择第一个一定是最优的;
如果没有更小的在范围里呢?
也很好思考,加满当前加油站便宜的油,去范围中最便宜的就行了 */
double D,C,D2,P,ans;
int flag=0;
int N,num; 
double minn=(1<<30); 
double dis_can;//当前油量可以走的路程 
struct st{
	double D;
	double P;
}str[10];
int main(){
	cin>>D>>C>>D2>>P>>N;
	str[1].D=0,str[1].P=P;//把出发点看成第一个加油站。 
	for(int i=1;i<=N;i++){
		cin>>str[i+1].D>>str[i+1].P;
	}
	for(int i=1;i<=N+1;i++){
		for(int j=i+1;j<=N+1;j++){
			if(str[j].D-str[i].D>C*D2&&j==i+1){//如果第一个都到不了,无解 
				cout<<"No Solution"<<endl;
				return 0;
			}
			if(str[j].D-str[i].D<=C*D2&&str[j].P<str[i].P)//从i到j,是合法的,又比我小。 
			{
				flag=1;//标记,告诉后面找到了 
				if(dis_can<str[j].D-str[i].D)ans+=(str[j].D-str[i].D-dis_can)/(D2*str[i].P);//更新答案 
				else dis_can-=(str[j].D-str[i].D);
				i=j;//来到这个加油站。
				break;
			} 
		}
		if(flag==0){//没有 
		    int j;
			for(j=i+1;j<=N+1;j++)
			if(str[j].D-str[i].D<=C*D2&&str[j].P<minn){minn=str[j].P,num=j;}
			ans+=(C*D2-dis_can)/(D2*str[i].P);
			dis_can=C*D2-(str[j].D-str[i].D);//加满 ,并到达 
			i=j;//来到这 
		}
		flag=0;
		minn=(1<<30);
	}
	printf("%.2f",ans);
	return 0;
}

2024/10/7 14:24
加载中...