• Codeforces 402B --耻辱的一题


    这题昨天晚上花了我1个小时50多分钟来搞,都没有搞定。。后来看别人代码,直接暴力枚举第一个数的值来做。。最多1000*1000的复杂度。当时怎么就没想到呢?还有为啥我的方法不对呢。。

    暴力方法代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define Mod 1000000007
    using namespace std;
    #define N 1007
    
    int a[N];
    
    int main()
    {
        int n,k,i,j,tmp,maxi,cnt,now,mini;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            mini = Mod;
            for(i=1;i<=1001;i++)
            {
                cnt = 0;
                tmp = i;
                for(j=1;j<=n;j++)
                {
                    if(a[j] != tmp)
                        cnt++;
                    tmp += k;
                }
                if(cnt < mini)
                {
                    mini = cnt;
                    now = i;
                }
            }
            printf("%d
    ",mini);
            tmp = now;
            for(i=1;i<=n;i++)
            {
                if(a[i] > tmp)
                    printf("- %d %d
    ",i,a[i]-tmp);
                else if(a[i] < tmp)
                    printf("+ %d %d
    ",i,tmp-a[i]);
                tmp += k;
            }
        }
        return 0;
    }
    View Code

    自己的做法:

    做一个参考数组b[],存放1,1+k,1+2k....1+(n-1)k,然后a,b两数组(a为原数组)个元素相减,得出差值数组cha,且将cha复制一份给cha2,将cha2从大到小排序,得出差值大于0的最大连续相同的差值(差值小于0肯定不行,因为从1开始的b数组是底线,比b还小说明会小于0,与题意不符),以最大连续差值的这些数为基准,这些数不变,将其他数变为使整个数组满足Ai+1-Ai = k,此时形成标准数组biao[],然后比较a[]和biao[],得出操作数和操作序列。但是就是不对,,不知道为啥,那位好心人如果发现这样那里不对欢迎向我指出,谢谢。

    自己代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define Mod 1000000007
    using namespace std;
    #define N 1007
    
    int a[N],biao[N],cha[N],b[N],cha2[N];
    
    int cmp(int ka,int kb)
    {
        return ka>kb;
    }
    
    int main()
    {
        int n,k,i,j,flag;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(i=1;i<=n;i++)
                b[i] = 1+(i-1)*k;
            for(i=1;i<=n;i++)
            {
                cha[i] = a[i]-b[i];
                cha2[i] = cha[i];
            }
            sort(cha2+1,cha2+n+1,cmp);
            int cnt = 1;
            int maxi = 0;
            for(i=2;i<=n;i++)
            {
                if(cha2[i] < 0)
                    break;
                if(cha2[i] == cha2[i-1])
                    cnt++;
                else
                {
                    if(cnt > maxi)
                    {
                        maxi = cnt;
                        flag = cha2[i-1];
                        cnt = 1;
                    }
                }
            }
            if(cnt > maxi)
            {
                maxi = cnt;
                flag = cha2[i-1];
            }
            for(i=1;i<=n;i++)
            {
                if(cha[i] == flag)
                {
                    break;
                }
            }
            for(j=i;j>=1;j--)
                biao[j] = a[i]-k*(i-j);
            for(j=i+1;j<=n;j++)
                biao[j] = a[i]+k*(j-i);
            cnt = 0;
            for(i=1;i<=n;i++)
            {
                if(a[i]!=biao[i])
                    cnt++;
            }
            printf("%d
    ",cnt);
            for(i=1;i<=n;i++)
            {
                if(a[i] != biao[i])
                {
                    if(a[i] > biao[i])
                    {
                        printf("- %d %d
    ",i,a[i]-biao[i]);
                    }
                    else
                        printf("+ %d %d
    ",i,biao[i]-a[i]);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [ Virtuoso ] 增加自定义 Layer 需要做哪些事?
    [ ENV ] 记录一些自己比较喜欢的初始化语句
    [ SVRF ] 学习笔记
    [ Skill ] 键位不够用之 右键 Menu
    ubuntu创建桌面快捷方式
    git常用命令
    架设Git服务器
    Linux下安装redis
    mysql查询语句
    mysql数据库基本操作
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3604843.html
Copyright © 2020-2023  润新知