XMU 1465.连续数列

来源:互联网 发布:关于淘宝美工工作流程 编辑:程序博客网 时间:2024/05/16 05:29
1465.连续数列
Time Limit: 1000 MS Memory Limit:65536 K
Total Submissions: 397 (77 users)Accepted: 48 (29 users)

 

Description
所谓连续整数列,指的是将含有n个整数的数列A中的所有整数重新从小到大排序以后得到的新的数列B, 满足, 对于任意正整数i, j(1 <= i,j <= n), 恒有Bj - Bi = j - i 。现在, 假定给你一个整数列C,你需要求出将其变为连续数列所需花费的最小代价和。(将整数x变为整数y需要花费|x - y|的代价, 所谓代价和,指的是改变所有数字所需花费的代价的总和)。

 

Input
输入的第一行有一个正整数n(1 <= n <= 100,000),接下来的一行有n个整数Ci (1 <= i <= n, -1,000,000,000 <= Ci <=1,000,000,000)。

 

Output
输出一个整数, 代表所需花费的最小代价和。

 

Sample Input
4
4 1 5 2

 

Sample Output
2

 

Hint
只需将数字5变为数字3即可, 所需花费的代价为|5 - 3| = 2
 
thingking:这道题目可以转化成高中的一道几何题。假设 a, b, c, ....N, 为数列A排序后形成的B,x1, x2,x3, x4, ....xn为数列B经最小代价转化为的连续数列。 那么最小代价和 sum= |a-x1|+|b-x2|+|c-x3|+.....+|n-xn|; 又因为x1, x2,x3,...xn为连续等差数列,所以等价于x+1, x+2,x+3,....x+n;则sum=|a-x-1|+|b-x-2|+|c-x-3|+....+|N-n-x|;可以把这个式子理解为:在x坐标系上有a-1,b-2,c-3...N-n,个点,求他们到x(未知点)的最小距离。则先求x的位置,根据以上几何问题,可以退出,x为这些点的中位数时,sum最小。
  还需要注意的一点事,要排2次序,求B数列时一次,求完坐标点后又一次;
#include
#include
#include
#include
using namespace std;
typedef long long int64;
int64 a[100010]={0}, x, sum = 0;
int main()
{
 int n, i;
 while(~scanf("%d",&n))
 {
  for(i=0; i
   scanf("%lld",&a[i]);
 
  sort(a, a+n);//求B数列
  for(i=0;i
   a[i] = a[i] -(i+1);
  sort(a,a+n);//排序后求X
  x =a[(n+1)/2-1];
  for(i=0;i
  {
   sum +=abs(a[i]-x);
  }
 
  printf("%lld\n", sum);
 }
 return 0;
}
 
0 0