题目
给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], …, a[r]。原始数组为
a[1], a[2], …, a[l-2], a[l-1], a[l], a[l+1], …, a[r-1], a[r], a[r+1], a[r+2], …, a[n-1], a[n],
将片段[l,r]反序后的数组是
a[1], a[2], …, a[l-2], a[l-1], a[r], a[r-1], …, a[l+1], a[l], a[r+1], a[r+2], …, a[n-1], a[n]。
#include <stdio.h>
int main(){
int n;
while(scanf("%d",&n) != EOF){
int i,a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int min = a[0];
int max = a[0];
int start,end;
for(i=1;i<n;i++){
if(min>a[i]){
start = i-1;
max = a[i];
break;
}
min = a[i];
}
//printf("%d\n",start);
for(i=start+2;i<n;i++){
if(max<a[i]){
end = i-1;
break;
}
max = a[i];
}
//printf("%d\n",end);
int change,index=(start+end)/2;
for(i=start;i<=index;i++){
if(i != end){
change = a[i];
a[i] = a[end];
a[end] = change;
end--;
}
}
int flag = 1;
for(i=0;i<n-1;i++){
if(a[i]>a[i+1]){
flag = 0;
break;
}
}
if(flag == 1){
printf("yes\n");
}else{
printf("no\n");
}
}
return 0;
}