1465.连续数列
Time Limit: 1000 MS
Memory Limit: 65536 K
Total Submissions: 397 (77 users) Accepted: 48 (29 users)
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
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最小。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int64;
int64 a[100010]={0}, x, sum = 0;
int main()
{
int n, i;
{
}