题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26405#problem/D
题意:给出一窜数字,要求求出,改变最少的数字个数,使得这串数字变成一个连续的递增的序列,
输出最少的变化个数和变化后的数组。
思路:
开一个数组,来记录数字和数组下标的差值,则找出出现次数最多的那个差值,所对应的数作为标准,
即可找出变化最少的次数,进而得到连续递增序列。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010],c[100010],b[100010];
int main()
{
int n,i,j,ans,cc,m,count;
while(~scanf("%d",&n))
{
memset(b,0,sizeof(b));
ans=0;
for(i=0,j=0; i<n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i]-i;
}
if(n==1)
{
printf("0\n%d\n",a[0]);
continue;
}
sort(b,b+n);
c[0]=1;
ans=0;
for(i=1,j=0; i<n; i++)
{
if(b[i]==b[i-1])
c[j]++;
if(ans<c[j])
{
ans=c[j];
cc=i;
}
if(b[i]!=b[i-1])
{
j++;
c[j]=1;
}
}
printf("%d\n",n-ans);
for(i=0; i<n; i++)
{
if(i)printf(" ");
printf("%d",i+b[cc]);
}
printf("\n");
}
return 0;
}