1 条题解
-
1
#include<bits/stdc++.h> using namespace std; const int N=1000000+10; const long long inf=0x7f7f7f7f7f7f7f7f; typedef long long ll; typedef double ddf; typedef int _int; #define int ll int n,m; int l[N],g[N],f[2][N][2],pr,nt; int t[2],s[2][N]; int ass; void fuck(){ memset(f,0x7f,sizeof(f)); t[1]=0; for(int j=1;j<=3;j++){ for(int k=g[j]-2;k<=g[j];k++){ if(k<=g[1])s[1][++t[1]]=k; } } for(int i=1;i<=t[1];i++)f[1][i][0]=f[1][i][1]=g[1]-s[1][i]; pr=0,nt=1; for(int i=2;i<=n;i++){ pr^=1,nt^=1;t[nt]=0; int lf=max(1ll,i-2),rf=min(n,i+2); for(int j=lf;j<=rf;j++){ for(int k=g[j]-2;k<=g[j];k++){ if(k<=g[i])s[nt][++t[nt]]=k; } } for(int j=1;j<=t[nt];j++){ f[nt][j][1]=f[nt][j][0]=inf; for(int k=1;k<=t[pr];k++){ if(s[pr][k]>s[nt][j])f[nt][j][0]=min(f[nt][j][0],f[pr][k][1]); else if(s[pr][k]<s[nt][j])f[nt][j][1]=min(f[nt][j][1],f[pr][k][0]); else f[nt][j][0]=min(f[nt][j][0],f[pr][k][0]),f[nt][j][1]=min(f[nt][j][1],f[pr][k][1]); } f[nt][j][0]+=g[i]-s[nt][j]; f[nt][j][1]+=g[i]-s[nt][j]; } } int re=inf; for(int i=1;i<=t[nt];i++)re=min(re,min(f[nt][i][0],f[nt][i][1])); ass+=re; } _int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++)scanf("%lld",&g[i]); //fuck(); fuck(); printf("%lld",ass); return 0; }
- 1
信息
- ID
- 1265
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者