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