妞妞得到一个(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 小白