题解:P13492 【MX-X14-T2】反转时光
前言:这道题目的数据真的很水。
进入正题:
一.我们怎么确定这道题是什么算法?
我们可以先看
对于
由此,我们可知暴力是会超时的,通过此题要用
二.如何得出规律?
我们可以针对样例:
对于样例一的解释:这明显是一个连续上升的序列,不用交换,所以
对于样例二的解释:这个序列有两个依次上升的子序列,我们可以交换这两个子序列,使它变得有序,所以
对于样例三的解释:对于这个完全无序的序列,我们可以输出
对于序列:
-
交换
3 、2 和4 得序列4 、3 、2 、1 。 -
交换
4 和3 得序列3 、4 、2 、1 。 -
交换
3 、4 和2 得序列2 、3 、4 、1 。 -
交换
2 、3 、4 和1 得序列1 、2 、3 、4 。
综上,我们的
三.代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],l;
bool check(int r){//判断 k 是否是 1 或 2。
for(int i=r;i<n;i++){
if(a[i]!=a[i+1]-1){
return 0;
}
}
for(int i=1;i<r-1;i++){
if(a[i]!=a[i+1]-1){
return 0;
}
}
//以上是遍历序列,看看它是否满足样例二的格式。
return 1;//满足返回 1。
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==1){
l=i;//记录 1 的位置,遍历的时候有一个起始点。
}
}
if(check(l)&&l==1){//特判,如果它是样例一的格式,输出 1。
cout<<1;
}
else if(check(l)){//否则如果它满足有两个依次上升的子序列,输出 2。
cout<<2;
}
else{//如果它是完全无序的序列,输出 3。
cout<<3;
}
return 0;
}