Csp-j 2023 T2题解
Csp-j 2023 T2题解
该题解中各个变量/名词含义
为表示方便,该题解会使用
使用什么算法
这道题使用动态规划算法做比较简单。因为我们在题目中会发现一个规律:通过第
算法步骤
- 拆分问题
这很简单,在“使用什么算法”板块我就说了,第一个站点到第
- 推导状态转移方程
我接下来会使用
则通过区间
由上面“拆分问题”步骤,可以得到状态转移方程为
- 确定边界
因为我们买的油可行驶路程为
把后面的路程减去
int j;
for(j=i+1;j<=n&&v[j]<duobuylc;j++)
{
//当第j段路程v[j]<duobuylc时,把它归零,并把duobuylc减去v[j]。直到v[j]>=duobuylc或j>n
duobuylc-=v[j];
v[j]=0;
}
if(j<=n)v[j]-=duobuylc;
除了多买,就没有特殊情况了,上代码:
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
int n,d,p[100001],v[100001],minprice[100001];
long long f[100001];//f最后会超过int表示范围,所以使用long long类型。
int main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
memset(minprice,0x3f,sizeof(minprice));
scanf("%d%d",&n,&d);
v[1]=0;
for(int i=2;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
minprice[i]=min(minprice[i-1],p[i]);//钱i个站点的最便宜油价
}
f[1]=0;
for(int i=2;i<=n;i++)
{
int buyyou=ceil(v[i]/double(d)),duobuylc=buyyou*d-v[i];
//buyyou:需要买的油数量,duobuylc:多买的油可行驶路程
f[i]=f[i-1]+buyyou*minprice[i-1];
//状态转移方程
int j;
for(j=i+1;j<=n&&v[j]<duobuylc;j++)
{
duobuylc-=v[j];
v[j]=0;
}
if(j<=n)v[j]-=duobuylc;
//把后面的路程减去多买油可以行驶的路程
}
printf("%ld",f[n]);
return 0;
}