我的思路是先直接向左走,求出所有起点左边加油站的最小花费,然后去更新右边第一个的最小花费,再去更新一遍左边,再去更新右边第二个,以此类推。但是不知道为什么WA了,有没有大佬能帮忙看一下思路或代码有啥问题或者给组hack数据靴靴qwq
#include <bits/stdc++.h>
using namespace std;
int n,s,t;
struct zhan{
int place;
int mon;
}a[100007];
bool cmp(zhan x,zhan y)
{
return x.place<y.place;
}
long long ans;
long long dp[100007];
inline long long zd(int fr,int to)
{
return abs(a[fr].place-a[to].place)*a[fr].mon;
}
int main()
{
cin>>n>>s>>t;
for(register int i=1;i<=n;++i)
{
dp[i]=1e18;
cin>>a[i].mon>>a[i].place;
}
sort(a+1,a+n+1,cmp);
int fromm;
for(register int i=n;i>=1;--i)
{
if(a[i].place>=t)
--n;
else if(a[i].place==s)
{
fromm=i;
break;
}
}
int wz=fromm;
dp[fromm]=0;
for(register int i=fromm-1;i>=1;--i)
{
dp[i]=dp[wz]+abs(a[wz].place-a[i].place)*a[wz].mon;
if(a[i].mon<a[wz].mon)
{
wz=i;
}
}
for(register int i=fromm+1;i<=n;++i)
{
for(register int j=i-1;j>=1;--j)
{
dp[i]=min(dp[i],zd(j,i)+dp[j]);
}
int wzz=i;
for(register int ii=i-1;ii>=1;--ii)
{
dp[ii]=min(dp[ii],dp[wzz]+abs(a[wzz].place-a[ii].place)*a[wzz].mon);
if(a[ii].mon<a[wzz].mon)
{
wzz=ii;
}
}
}
ans=1e18;
for(register int i=1;i<=n;++i)
{
long long wzz=i;
long long sum=dp[i];
for(register int j=i+1;j<=n;++j)
{
if(a[j].mon<a[wzz].mon)
{
sum+=abs(a[wzz].place-a[j].place)*a[wzz].mon;
wzz=j;
}
}
sum+=abs(a[n].place-t)*a[wzz].mon;
ans=min(ans,sum);
}
cout<<ans<<endl;
return 0;
}