刚学OI3s萌新求助关于月赛div2T3
  • 板块学术版
  • 楼主Iam1789
  • 当前回复20
  • 已保存回复20
  • 发布时间2021/4/5 18:37
  • 上次更新2023/11/5 00:59:45
查看原帖
刚学OI3s萌新求助关于月赛div2T3
414210
Iam1789楼主2021/4/5 18:37

我的思路是先直接向左走,求出所有起点左边加油站的最小花费,然后去更新右边第一个的最小花费,再去更新一遍左边,再去更新右边第二个,以此类推。但是不知道为什么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;
}
2021/4/5 18:37
加载中...