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了求大佬解答

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-19 17:02
鼠鼠深知pdd的强度很大,但是现在没有大厂offer,只有一些不知名小厂我是拒绝等秋招呢,还是接下?求大家帮忙判断一下!
水中水之下水道的鼠鼠:接了再说,不图转正的话混个实习经历也不错
投递拼多多集团-PDD等公司10个岗位 >
点赞 评论 收藏
分享
AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务