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\n",mini);

        tmp = now;

        for(i=1;i<=n;i++)

        {

            if(a[i] > tmp)

                printf("- %d %d\n",i,a[i]-tmp);

            else if(a[i] < tmp)

                printf("+ %d %d\n",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\n",cnt);

        for(i=1;i<=n;i++)

        {

            if(a[i] != biao[i])

            {

                if(a[i] > biao[i])

                {

                    printf("- %d %d\n",i,a[i]-biao[i]);

                }

                else

                    printf("+ %d %d\n",i,biao[i]-a[i]);

            }

        }

    }

    return 0;

}
View Code

 

你可能感兴趣的:(codeforces)