警示后人
查看原帖
警示后人
179601
Win_dreamer楼主2025/7/30 15:54

这道题我调试了好久,也是在豆包的不懈努力下找到问题了,在前往范围内最低油价的加油站时,不仅要把储油量设置为加满状态,在计算价格时也要按加满处理。

#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
struct dp{
    float d,p;
}oil[100];
float c,s,sum,cb;
int tp,n;
bool line(dp a,dp b){
	return a.d<b.d;
}
void move(){
	int mn;
	float mi=1e6;
	for(int i=tp+1;i<=n;i++){
		if(oil[i].d-oil[tp].d>c*s) break;
		if(oil[i].p<=oil[tp].p){
			float m=(oil[i].d-oil[tp].d)/s;
			if(cb>=m){
				cb-=m;
				tp=i;
				move();
				return;
			}
			sum+=(m-cb)*oil[tp].p;
			cb=0;
			tp=i;
			move();
			return;
		}
		if(mi>=oil[i].p){
			mi=oil[i].p;
			mn=i;
		}
	}
	if(oil[99].d-oil[tp].d<=c*s){
		sum+=((oil[99].d-oil[tp].d)/s-cb)*oil[tp].p;
		return;
	}
	//旧程序:sum+=((oil[mn].d-oil[tp].d)/s-cb)*oil[tp].p;
	//正确的程序: 
	sum+=(c-cb)*oil[tp].p
	cb=c-(oil[mn].d-oil[tp].d)/s;
	tp=mn;
	move();
}
int main(){
	cin>>oil[99].d>>c>>s>>oil[0].p>>n;
    for(int i=1;i<=n;i++){
    	cin>>oil[i].d>>oil[i].p;
    	if(oil[i].d-oil[i-1].d>c*s){
			cout<<"No Solution";
    		return 0;
		}
	}
    if(oil[99].d-oil[n].d>c*s){
		cout<<"No Solution";
    	return 0;
	}
    sort(oil+1,oil+n+1,line);
    move();
	cout<<fixed<<setprecision(2)<<sum;
	return 0;
}

否则只有75分,这里附上#5测试点:(错误时输出结果为175.29 )

input:
475.6 11.9 27.4 14.98 6
102.0 9.99
220.0 13.29
256.3 14.79
275.0 10.29
277.6 11.29
381.8 10.09

ans:
192.15

如果帖子不合规请随时敲我谢谢!

2025/7/30 15:54
加载中...