妞妞得到一个(1~n)的排列p1, p2, p3,...,pn, 听村里的老人牛牛说如果让这个排列变为:
对于所有的1 <= i <= n, 都满足pi ≠ i, 就可以获得Google Girl Hackathon的入场券。
妞妞仅允许的操作是: 交换排列中两个相邻的元素, 并且妞妞允许做这个操作任意次。
但是Google Girl Hackathon就快要开始了, 妞妞希望做最少的操作就使排列满足要求, 妞妞希望你能帮助她。
妞妞得到一个(1~n)的排列p1, p2, p3,...,pn, 听村里的老人牛牛说如果让这个排列变为:
但是Google Girl Hackathon就快要开始了, 妞妞希望做最少的操作就使排列满足要求, 妞妞希望你能帮助她。
输入包括两行, 第一行包括一个正整数n(2 <= n <= 10^5), 表示排列的长度和范围。
第二行包括n个正整数p1, p2, p3,...,pn, 即妞妞得到的排列, 保证是一个1~n的排列。
输出一个整数, 表示妞妞需要的操作次数。
5 1 4 3 5 2
2
本套6道题全部pass的C++代码已挂到了我的GitHub(https://github.com/shiqitao/NowCoder-Solutions)
#include using namespace std; int main() { int n; cin >> n; int equal = 0, count = 0, data; while (count < n) { cin >> data; if (data == ++count) { if (count != n) cin >> data; count++; equal++; } } cout << equal; return 0; }
本套试题AC代码在https://github.com/ReyzalX/nowcoder查看
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int result = 0;
int i = 0;
while(i < n)
{
int num;
cin >> num;
//如果当前数等于i 则次数+1
//如果下面一个数等于i+1 则次数也是+1
if (num == i+1) {
if (i < n) {
i++;
cin >> num;
}
result++;
}
i++;
}
cout << result << endl;
return 0;
}
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); boolean[] arr = new boolean[n]; for (int i = 1; i <= n; i ++) { if(sc.nextInt() == i) arr[i - 1] = true; } int count = 0; int i = 0; while (i < n) { if(arr[i]) { count ++; i += 2; } else i ++; } System.out.println(count); } } }
#include<iostream> #include<algorithm> using namespace std; int main(){ int n; scanf("%d",&n); bool flag=false; int cnt=0; for(int i=1;i<=n;i++){ int temp; scanf("%d",&temp); if(temp==i && flag==false){ cnt++; flag=true; }else flag=false; } printf("%d",cnt); return 0; }
import sys def main(): n = int(input()) a = [int(i) for i in input().split(' ')] res = 0 for i in range(n-1): if int(a[i]) == i+1: a[i],a[i+1] = a[i+1],a[i] res +=1 if a[n-1] == n: res +=1 print(res) if __name__ == "__main__": main() python3 小白