这道题我调试了好久,也是在豆包的不懈努力下找到问题了,在前往范围内最低油价的加油站时,不仅要把储油量设置为加满状态,在计算价格时也要按加满处理。
#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
如果帖子不合规请随时敲我谢谢!