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