zoukankan      html  css  js  c++  java
  • 【推导】AtCoder Regular Contest 082 D

    题意:给你一个排列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
    ",ans);
    	return 0;
    }
  • 相关阅读:
    动手动脑
    大道至简第七八章读后感
    super 的用法
    第六章
    课后作业
    大道至简第五章读后感
    课后作业
    大道至简第四章读后感
    大道至简——第六章
    Java数组课后作业
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7469344.html
Copyright © 2011-2022 走看看