XMU 1465.连续数列

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值