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