zoj 3365

题意 给你一个序列  改变尽可能少的数使其成为公差为一 递增的等差数列 

 可以将给你的序列减去一个等差数列 即num[i] -= i,若得到的数全部相等, 则说明给你的序列本身就满足条件  则只要寻求num中出现次数最多的数  这些数就是不需要改变的数

/*************************************************************************
    > Author: xlc2845       > Mail: xlc2845@gmail.com
    > Created Time: 2013年10月26日 星期六 19时15分23秒
 ************************************************************************/

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>

using namespace std;
int num[50050], n;
int main()
{
    while(scanf("%d",&n) == 1)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&num[i]);
            num[i] -= i;
        }
        sort(num, num+n);
        int temp = num[0], _max = 0, d = 1, result = num[0];
        for(int i = 1; i < n; i++)
        {
            if(num[i] == temp) d++;
            else
            {
                temp = num[i];
                if(d > _max)
                {
                    _max = d;
                    result = num[i-1];
                }
                d = 1;
            }
        }
        if(d > _max)
        {
            _max = d;
            result = num[n-1];
        }
        printf("%d\n",n-_max);
        printf("%d",result);
        for(int i = 1; i < n; i++)
            printf(" %d",i+result);
        puts("");
    }
    return 0;
}



posted @ 2013-10-27 13:22  xlc2845  阅读(145)  评论(0编辑  收藏  举报