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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号