题意传送门:
http://www.lydsy.com/JudgeOnline/problem.php?id=4884
设f[i][0/1]分别为重力为向下/向上时走到第i列消耗的最小值。
然后瞎转移,注意如果前面比脚下要低的话会掉下去,不用消耗能量值,直接转移。
判断一下无路可走输出-1的情况即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
long long f[110000][2];//f[i][0]走到第i个格子重力向下,f[i][1]走到第i个格子重力向上
long long a[110000],b[110000];
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
for(int i=1;i<n;i++)
{
if( a[i]<=b[i] || a[i]<=b[i+1] || b[i]>=a[i+1])
{
printf("-1\n");
return 0;
}
}
memset(f,127,sizeof(f));
f[1][0]=0;
for(int i=1;i<=n;i++)
{
long long t0=f[i][0],t1=f[i][1];
f[i][0]=min(f[i][0],t1+(a[i]-b[i]));
f[i][1]=min(f[i][1],t0+(a[i]-b[i]));
if(b[i+1]<=b[i]) f[i+1][0]=f[i][0];
if(a[i+1]>=a[i]) f[i+1][1]=f[i][1];
}
printf("%lld\n",f[n][0]);
}