http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1465
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
double arr[112345];
int N;
inline double Abs( double x ){ return x>0?x:-x;}
inline double Min( double a,double b ){return a>b?b:a;}
double work( double ans )
{
double res = 0;
for( int i = 1; i <= N; i++ )
res += Abs( arr[i] - ans );
return res;
}
int main( )
{
while( scanf("%d",&N) != EOF )
{
for( int i = 1; i <= N; i++ )
scanf("%lf",&arr[i]);
sort( &arr[1],&arr[1]+N );
for( int i = 1; i <= N; i++ )
arr[i] -= (i-1);
sort( &arr[1],&arr[1]+N );
double lt = arr[1],rt = arr[N];
while( rt - lt >= 3 )
{
double ans1 = (rt+lt+lt)/3.;
double ans2 = (rt+rt+lt)/3.;
double res1 = work(ans1);
double res2 = work(ans2);
if( res1 < res2 ) rt = ans2;
else lt = ans1;
}
lt = int (lt-1); rt = int( rt+1 );
double res = work(lt*1.);
for( int i = lt; i <= rt; i++ )
res = Min( res,work(i*1.) );
printf("%.lf\n",res);
}
return 0;
}
另一种方法
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
long long arr[112345];
int main( )
{
long long N;
while( scanf("%lld",&N) != EOF )
{
for( long long i = 1; i <= N; i++ )
scanf("%lld",&arr[i]);
sort( &arr[1],&arr[1]+N );
for( long long i = 1; i <= N; i++ )
arr[i] -= (i-1);
sort( &arr[1],&arr[1]+N );
if( N%2 )
{
long long tab = N/2+1,res = 0;
for( long long i = 1; i <= N; i++ )
res += abs( arr[i] - arr[tab] );
printf("%lld\n",res);
}
else
{
long long tab1 = N/2;
long long tab2 = N/2+1;
long long res = 0,ans = 0;
for( long long i = 1; i <= N; i++ )
ans += abs( arr[i] - arr[tab1] );
for( long long i = 1; i <= N; i++ )
res += abs( arr[i] - arr[tab2] );
printf("%lld\n",min( res,ans ) );
}
}
return 0;
}