Codeforces Round #655 (Div. 2) C. Omkar and Baseball (思維)
阿新 • • 發佈:2020-07-16
-
題意:有一個數組,每次可以修改子陣列,但是修改後每個元素的位置都必須變化,求最少修改多少次使得這個陣列有序.
-
題解:假如這個陣列本來就有序,我們直接輸出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; }