题意:有一个数组,每次可以修改子数组,但是修改后每个元素的位置都必须变化,求最少修改多少次使得这个数组有序.
题解:假如这个数组本来就有序,我们直接输出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;
}
Codeforces Round #655 (Div. 2) C. Omkar and Baseball (思维)
原文:https://www.cnblogs.com/lr599909928/p/13322322.html