好基友(模拟)
样例输入:
2
0 2 1 3
2
3 2 0 1
输出:
1
0
这道题目真的写的头都大了,找了很久的bug,一直不知道错了哪,最后发现把数字写错了,该加一的减了一,一直错,后面debug看到了数组里面数交换的不对才发现问题。
其实解法很简单,因为不需要相邻就可以交换,那要想全部达到条件交换就可以一个一个找,输入的时候记录好每个数字的位置,然后,每次更新交换到后面的数的位置和值就好了,因为前面的数不会再被遍历到,最后输出就行了。
#include<bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int m=2*n;
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
a[b[i]]=i;
}
int sum=0;
for(int i=0;i<m;i+=2){
if(b[i]&1){
if(b[i+1]+1==b[i]){//是就不需要处理
}else{//要处理的
a[b[i+1]]=a[b[i]-1];//把i+1位换到b[i]的朋友的位置
b[a[b[i]-1]]=b[i+1];//把i+1位的值也赋过去
sum++;
}
}else{//同上
if(b[i]==b[i+1]-1){
}else{
a[b[i+1]]=a[b[i]+1];/*当时这里写成了a[b[i+1]]=a[b[i]-1],所以错了*/
b[a[b[i]+1]]=b[i+1];
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}