题目链接:
https://cn.vjudge.net/problem/25167/origin
思路:
这是一道水题,但是一开始思路有点问题。。
1000的数据大小,直接暴搜左开始第一个与i不等的下标,再从右开始搜第一与i不等的下标
然后用swap,或者reverse翻转一下,再进行对比就行。
有一个小坑就是原本就是顺序的话不行,因为题目明确要求必须翻转一次!
下面是AC代码:
#include <iostream>
#include <cstdio> using namespace std;
const int MX = 1e3+;
int a[MX]; int main()
{
bool flag = true;
int n;
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
int le = , ri = ;
for(int i = ; i <= n; ++i)
{
if(a[i] != i)
{
le = i;
break;
}
}
for(int i = n; i >= ; i--)
{
if(a[i] != i)
{
ri = i;
break;
}
}
if(le == && ri == ) flag = false; for(int i = le; i <= (le+ri)/; ++i)
{
swap(a[i], a[ri-i+le]);
//printf("%d %d\n", a[i], a[ri-i+le]);
} for(int i = ; i <= n; ++i)
{
//cout << a[i]; if(a[i] != i)
{
flag = false;
break;
} }
if(flag) printf("%d %d\n", le, ri);
else printf("0 0\n");
}
如有疑问,欢迎评论指出!