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
原文地址:https://www.cnblogs.com/whatbeg/p/3604843.html