返回顶部

Codeforces Round #655 (Div. 2) C. Omkar and Baseball (思维)

  • 题意:有一个数组,每次可以修改子数组,但是修改后每个元素的位置都必须变化,求最少修改多少次使得这个数组有序.

  • 题解:假如这个数组本来就有序,我们直接输出0.否则,对于数组两端,假如它们有序,那么我们可以不用做任何操作,直接看中间部分,所以我们分别扫一遍两端,分别找到两端第一个不满足条件的位置,然后我们遍历中间这个部分,如果没有任何一个位置的下标等于自己,那么操作数就是\(1\),如果有,我们就要先把它们打乱,然后再排序,所以操作数是\(2\).

  • 代码:

    int t;
    int n;
    int a[N];
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
      	cin>>t;
      	 while(t--){
      	 	cin>>n;
      	 	 for(int i=1;i<=n;++i){
      	 	 	cin>>a[i];
      	 	 }
      	 	 int l=1,r=n;
      	 	 while(l<=n && l==a[l]) l++;
      	 	 while(r>=1 && r==a[r]) r--;
      	 	 if(l==n+1 && r==0){
      	 	 	cout<<0<<endl;
      	 	 }
      	 	 else{
      	 	 	bool ok=0;
      	 	 	for(int i=l;i<=r;++i){
      	 	 		if(a[i]==i){
      	 	 			ok=1;
      	 	 			break;
      	 	 		}
      	 	 	}
      	 	 	if(ok) cout<<2<<endl;
      	 	 	else cout<<1<<endl;
      	 	 }
      	 }
     
        return 0;
    }
    
posted @ 2020-07-16 14:03  _Kolibri  阅读(204)  评论(2)    收藏  举报