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了求大佬解答
查看5道真题和解析