D题求大佬解答疑惑
第一种能过
#include <bits/stdc++.h> using namespace std; #define int long long #define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) typedef long long ll; typedef pair<int, int>PII; int n; int a[100005]; int pre[100005];//pre[i]表示1-i个数中乘2后变化值最小的数 int suf[100005];//suf[i]表示从i到n中乘2后变化值最小的数 int mul[100005]; int f(int pos,int val) { int ans=0; if(pos-1>=1)ans+=abs(val-a[pos-1]); if(pos+1<=n)ans+=abs(val-a[pos+1]); return ans; } signed main() { ios; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } int ans=0; for(int i=1;i<n;i++) { ans+=abs(a[i+1]-a[i]); } int add=1e15; pre[0]=1e15; suf[n+1]=1e15; for(int i=1;i<=n;i++) { mul[i]=f(i,a[i]*2)-f(i,a[i]); pre[i]=min(pre[i-1],mul[i]); } for(int i=n;i>=1;i--) { suf[i]=min(suf[i+1],mul[i]); } //1.abs(i-j)>1; for(int i=1;i<=n;i++) { int t=f(i,a[i]/2)-f(i,a[i]); int mi=1e15; if(i-2>=1)mi=min(mi,pre[i-2]); if(i+2<=n)mi=min(mi,suf[i+2]); add=min(add,t+mi); } //2.abs(i-j)==0 for(int i=1;i<=n;i++) { int t=f(i,a[i]/2*2)-f(i,a[i]); add=min(add,t); } //3.abs(i-j)==1 for(int i=1;i<=n;i++) { for(int j:{i-1,i+1}) { if(j>=1&&j<=n) { int svi=a[i],svj=a[j]; int r1=f(i,a[i])+f(j,a[j])-abs(a[i]-a[j]); a[i]/=2;a[j]*=2; int r2=f(i,a[i])+f(j,a[j])-abs(a[i]-a[j]); add=min(add,r2-r1); a[i]=svi;a[j]=svj; } } } cout<<ans+add; }
第二种我把最后一种的情况代码改写了一下其他都没变
#include <bits/stdc++.h> using namespace std; #define int long long #define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) typedef long long ll; typedef pair<int, int>PII; int n; int a[100005]; int pre[100005];//pre[i]表示1-i个数中乘2后变化值最小的数 int suf[100005];//suf[i]表示从i到n中乘2后变化值最小的数 int mul[100005]; int f(int pos,int val) { int ans=0; if(pos!=1)ans+=abs(val-a[pos-1]); if(pos!=n)ans+=abs(val-a[pos+1]); return ans; } signed main() { ios; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } int ans=0; for(int i=1;i<n;i++) { ans+=abs(a[i+1]-a[i]); } int add=1e15; pre[0]=1e15; suf[n+1]=1e15; for(int i=1;i<=n;i++) { mul[i]=f(i,a[i]*2)-f(i,a[i]); pre[i]=min(pre[i-1],mul[i]); } for(int i=n;i>=1;i--) { suf[i]=min(suf[i+1],mul[i]); } //1.abs(i-j)>1; for(int i=1;i<=n;i++) { int t=f(i,a[i]/2)-f(i,a[i]); int mi=1e15; if(i-2>=1)mi=min(mi,pre[i-2]); if(i+2<=n)mi=min(mi,suf[i+2]); add=min(add,t+mi); } //2.abs(i-j)==0 for(int i=1;i<=n;i++) { int t=f(i,a[i]/2*2)-f(i,a[i]); add=min(add,t); } //3.abs(i-j)==1 for(int i=1;i<=n;i++) { for(int j:{i-1,i+1}) { if(j>=1&&j<=n) { int tai=a[i]/2; int taj=a[j]*2; int t1=f(i,tai)+f(j,taj)-abs(tai-taj); int t2=f(i,a[i])+f(j,a[j])-abs(a[i]-a[j]); add=min(add,t1-t2); } } } cout<<ans+add; }
就只能过%56了求大佬解答