题意:给你一个排列a,每次可以交换相邻的两个数。让你用最少的交换次数使得a[i] != i。

对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i。

对于两个相邻的,其中一个a[i]==i,另一个a[i]!=i的数,一次交换也必然可以使得它们的a[i]都不等于i。

于是可以把序列划分成多段连续的a[i]==i的段落,它所贡献的交换次数就是[(长度+1)/2]。

#include<cstdio>
using namespace std;
int n,a[100005];
int main(){
//	freopen("b.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	int sta,ans=0;
	for(int i=1;i<=n;++i){
		if((i==1 && a[i]==i) || (a[i]==i && a[i-1]!=i-1)){
			sta=i;
		}
		if((i==n && a[i]==i) || (a[i]==i && a[i+1]!=i+1)){
			ans+=(i-sta+2)/2;
		}
	}
	printf("%d\n",ans);
	return 0;
}

相关文章:

  • 2022-03-07
  • 2022-12-23
  • 2021-10-03
  • 2022-12-23
  • 2021-06-05
  • 2018-09-02
  • 2021-12-02
  • 2022-12-23
猜你喜欢
  • 2022-01-04
  • 2021-08-04
  • 2022-12-23
  • 2021-05-18
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案