p1016旅行者的题解
纪念蒟蒻的第一次切绿题没有看题解独自ac且一次过
其实也看了一下
题目链接[(https://www.luogu.com.cn/probleP1016)]
不难发现,只需要进行两种决策,一种是到达更便宜的油站,实在不行就奢侈一把,用98的好油,实际上都是跑那么点距离
从最简单的决策思考,一种跳出循环的方式即是找到更便宜的油站,撞狗屎运了,另一种便是去最远的地方去接点好油
q:那么如何跑到最远呢?
a:很简单,奢侈一把装满油即可
代码实现如下
#include<bits/stdc++.h>
using namespace std;
struct add{
double qian;
double di;
}a[10];
double ans=0;
double d,c,d2,p;
int n;
double now;//表当前油箱剩余的量
/*bool cmp(add x,add y){
return x.qian<y.qian;
}抽象排序别看了
*/
int main(){
cin>>d>>c>>d2>>p>>n;
a[n+1].di=d;
a[0].qian=p;
for(int i=1;i<=n;i++){
cin>>a[i].di>>a[i].qian;
if(a[i].di-a[i-1].di>c*d2){//吃饱了跑不过去就躺地上说出那句话即可
cout<<"No Solution"<<"\n";
return 0;
}
}
int j=0;
for(int i=0;i<=n+1;i=j){
for(j=i+1;j<=n+1;j++){//有且仅有两种跳出的方式
if(a[j].di-a[i].di>c*d2){
j--;
break;
}
if(a[j].qian<a[i].qian){
break;
}
}
if(a[j].qian<a[i].qian){//有小的就跑去
ans+=((a[j].di-a[i].di)/d2-now)*a[i].qian;
}
else {
ans+=(c-now)*a[i].qian;
now=c-(a[j].di-a[i].di)/d2;
}//这里是实在没有小的了,能去的最远的距离,为什么这样写可以呢?
}
printf("%.2f\n",ans);//ans:因为每一步都是当前最优解
return 0;
}
对了,感谢大佬@swkyccbb的思路,虽然您早已不在luogu但感谢您的思路
good bye