http://codeforces.com/contest/394/problem/D
题意:给你n个数,然后通过操作使得这n个数变为一个等差数列,操作是可以经过小于等于k次加1或减去1,要使得k尽量小。
思路:通过枚举公差d,然后通过每一个减去相应的个数的d,找到首项,每一个都可以得到一个首项,在这些首项中找到最大值和最小值,我们取最大值和最小值的一半为a1,然后找到一个k,在等到的很多个k中找到最小值。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 10010
using namespace std;
const int inf=<<; int n;
int a[maxn],a1,d; int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=inf;
for(int k=; k<=; k++)
{
int max1=-inf,min1=inf;
for(int i=; i<n; i++)
{
min1=min(min1,a[i]-i*k);
max1=max(max1,a[i]-i*k);
}
int x=(min1+max1)/;
if(ans>max(x-min1,max1-x))
{
ans=max(x-min1,max1-x);
a1=x;
d=k;
}
}
printf("%d\n",ans);
printf("%d %d\n",a1,d);
}
return ;
}