题目:
Patrick likes to play baseball, but sometimes he will spend so many hours hitting home runs that his mind starts to get foggy! Patrick is sure that his scores across n sessions follow the identity permutation (ie. in the first game he scores 1 point, in the second game he scores 2 points and so on). However, when he checks back to his record, he sees that all the numbers are mixed up!
Define a special exchange as the following: choose any subarray of the scores and permute elements such that no element of subarray gets to the same position as it was before the exchange. For example, performing a special exchange on [1,2,3] can yield [3,1,2] but it cannot yield [3,2,1] since the 2 is in the same position.
Given a permutation of n integers, please help Patrick find the minimum number of special exchanges needed to make the permutation sorted! It can be proved that under given constraints this number doesn't exceed 10^18.
An array aa is a subarray of an array bb if a can be obtained from b by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.
思路:
①全部都是正确位置 0
②从前后跑到第一个不是a[i] = i,从后往前跑到第一个不是a[i] = i,判断中间的是不是都是a[i] != i,如果是就是1,不是就是2
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <queue>
5 #include <string>
6 #include <vector>
7 #include <cmath>
8
9 using namespace std;
10
11 #define ll long long
12 #define pb push_back
13 #define fi first
14 #define se second
15
16 const int N = 2e5 + 10;
17 int a[N];
18
19 void solve()
20 {
21 int T;
22 cin >> T;
23 while(T--){
24 int n;
25 cin >> n;
26 for(int i = 1; i <= n; ++i) cin >> a[i];
27 int same = 0;
28 for(int i = 1; i <= n; ++i){
29 if(a[i] == i) same++;
30 }
31 if(same == n) cout << 0 << endl;
32 else{
33 int l, r;
34 for(int i = 1; i <= n; ++i){
35 if(a[i] == i) continue;
36 l = i - 1;
37 break;
38 }
39 for(int i = n; i >= 1; --i){
40 if(a[i] == i) continue;
41 r = i + 1;
42 break;
43 }
44 same = 0;
45 //cout << "l = " << l << " " << " r = " << r << endl;
46 for(int i = l + 1; i <= r - 1; ++i){
47 if(a[i] == i) same++;
48 }
49 if(same == 0) cout << 1 << endl;
50 else cout << 2 << endl;
51 }
52 }
53 }
54
55 int main()
56 {
57 ios::sync_with_stdio(false);
58 cin.tie(0);
59 cout.tie(0);
60 solve();
61
62 return 0;
63 }
来源:oschina
链接:https://my.oschina.net/u/4417091/blog/4435914