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

全部评论

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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