hust-Integer Numbers解题报告
给一串数字,要求不改变这些数字的顺序,只改变其中一些数字的值,使这一串数字变为一个连续的数字。求出最小的改变方案。
做题思路:
给的数字啊a[n],每一个都减去自己的序号数,得到一串数字b[n]。例如:5 4 5 2 1 8减完之后就得到:5 3 3 -1 -3 3;然后再对b[n]排序,之后找出b[n]中出现次数最多的数字,将其作为temp.并且记录temp出现的次数,记为max.然后以temp作为标准,再一次加上序号,就可以得到答案。如:5 4 5 2 1 8其temp= 3,max=3.所以最终结果就是3 4 5 6 7 8.更改的数字个数为n-max=6-3=3.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define maxn 50010
using namespace std;
bool cmp(int x,int y)
{
if(x<y)
return true;
return false;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[maxn],b[maxn];
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]-i;
}
sort(b,b+n,cmp);//对b[n]进行排序
int temp,max=1,count=1;
temp=b[0];//找出temp与max
for(i=0;i<n-1;i++)
{
if(b[i]==b[i+1])
count++;
else
{
if(count>max)
{
max=count;
temp=b[i];
}
count=1;
}
}
if(count>max)
{max=count;temp=b[i];}
for(i=0;i<n;i++)//依次用temp加上序号
a[i]=i+temp;
printf("%d\n",n-max);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
return 0;
}