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;
}

浙公网安备 33010602011771号