1 条题解

  • 0
    @ 2025-8-24 21:35:27

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lzl123
    **

    搬运于2025-08-24 21:35:27,当前版本为作者最后更新于2018-01-07 20:15:05,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本来想水个三十分先

    于是写了个排序

    结果直接A题!

    ——尴尬....本来打算写平衡树的,看到排序都A了就无趣咯

    其实就是直接根据每天的值排序,然后它左右最近的数一定是和它的值相差最小的嘛

    于是在左右都看看,如果天数比它的天数小就满足题意所以直接算到答案里去噻

        #include <cstdio>
        #include <algorithm>
        #define ri register int
        #define getchar() (S==T&&(T=(S=BB)+fread(BB,1,1<<15,stdin),S==T)?EOF:*S++)
        char BB[1<<20],*S=BB,*T=BB;
        using namespace std;
        int n,sum;
        inline int read() 
        {
            int num=0,w=1; char ch=0;
            while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar(); }
            while(ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
            return num*w;
        }
        struct A{
            int num,day;
        }a[100000];
        bool cmp(A a,A b)
        {  
            return a.num<b.num;  
        } 
        inline int check(int x)
        {    int p=2147483647,t=2147483647;
            if(a[x].day==1)    return a[x].num;
            for(ri i=x-1;i>=1;--i)
                            if(a[i].day<a[x].day)    {p=(a[i].num>a[x].num)?a[i].num-a[x].num:a[x].num-a[i].num;break;}
            for(ri i=x+1;i<=n;++i)
                            if(a[i].day<a[x].day)    {t=(a[i].num>a[x].num)?a[i].num-a[x].num:a[x].num-a[i].num;break;}
            return (p>t)?t:p;
        }
        int main()
        {
            n=read();
            for(ri i=1;i<=n;++i)
                a[i].num=read(),a[i].day=i;
            sort(a+1,a+1+n,cmp);
            for(ri i=1;i<=n;++i)
                sum+=check(i);
            printf("%d",sum);
            return 0;
    }
    
    • 1

    信息

    ID
    1233
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者