[2018-5-4]BNUZ你们还差得远呢

有一次卡再水题的,还是因为小细节问题,感觉还是题打的少?想想还是自己的细节考虑不到位吧。。。想到一个办法,拿本子把每次的错误一条条记下来,以后再有wa的时候,一条条对照排除下错误,不知道有没有用。然后还要多背单词了,现在读题速度又很慢,还是因为大多单词不认识,加油!!

Building Permutation
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

 

Description

Permutation p is an ordered set of integers p1,  p2,  ...,  pn, consisting of n distinct positive integers, each of them doesn't exceed n. We'll denote the i-th element of permutation p as pi. We'll call number n the size or the length of permutation p1,  p2,  ...,  pn.

You have a sequence of integers a1, a2, ..., an. In one move, you are allowed to decrease or increase any number by one. Count the minimum number of moves, needed to build a permutation from this sequence.

Input

The first line contains integer n (1 ≤ n ≤ 3·105) — the size of the sought permutation. The second line contains n integersa1, a2, ..., an ( - 109 ≤ ai ≤ 109).

Output

Print a single number — the minimum number of moves.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Sample Input

Input
2
3 0
Output
2
Input
3
-1 -1 2
Output
6

Hint

In the first sample you should decrease the first number by one and then increase the second number by one. The resulting permutation is(2, 1).

In the second sample you need 6 moves to build permutation (1, 3, 2)

题意:给出n个数字,要求这些数字全都符合1 <= ai <=n,比如-1到1需要两步,变0再变1,求变成这个序列最小步数。
解法:就是把着N个数字变成从N~1之间的数字就好,比如n = 3,就把三个数字变成(3,2,1),然后想法是排序,然后从大往小变成n,然后n减1;
#include<bits/stdc++.h>
using namespace std;
long long int num[1000005];
int cmp(int a,int b) {
	return a>b;
}
int main() {
	long long int n,s,t,mark,p,count;
	while(cin >> n) {
		p = 1;
		count = 0;
		for(int i = 0; i < n; i++) {
			cin>>num[i];
		}
		sort(num,num+n,cmp);
		s = n;
		for(int i = 0 ; i < s ; i++) {
			count += abs(num[i] - n);
			n--;
		}
		cout << count << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值