题目描述
妞妞得到一个(1~n)的排列p1, p2, p3,...,pn, 听村里的老人牛牛说如果让这个排列变为:
对于所有的1 <= i <= n, 都满足pi ≠ i, 就可以获得Google Girl Hackathon的入场券。
妞妞仅允许的操作是: 交换排列中两个相邻的元素, 并且妞妞允许做这个操作任意次。
但是Google Girl Hackathon就快要开始了, 妞妞希望做最少的操作就使排列满足要求, 妞妞希望你能帮助她。
输入描述:
输入包括两行, 第一行包括一个正整数n(2 <= n <= 10^5), 表示排列的长度和范围。 第二行包括n个正整数p1, p2, p3,...,pn, 即妞妞得到的排列, 保证是一个1~n的排列。
输出描述:
输出一个整数, 表示妞妞需要的操作次数。
示例1
输入
复制
5 1 4 3 5 2
输出
复制
2
思路:遇到a[i]=i的数 ,与旁边的数a[i+1]位置互换。因为a[i]=i,当互换的时候a[i]肯定满足a[i]=a[i+1]!=i;
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(a[i]==i)
{
if(i<=n)
swap(a[i],a[i+1]);
else swap(a[i],a[i-1]);
cnt++;
}
}
printf("%d\n",cnt);
//for(int i=1;i<=n;i++)printf("%d ",a[i]);
//printf("\n");
}
}
269

被折叠的 条评论
为什么被折叠?



