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