1. 程式人生 > 實用技巧 >Codeforces Round #655 (Div. 2) C. Omkar and Baseball (思維)

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;
    }