题目大意:给定n名学生从1到n编号,能顺时针或逆时针按序排成一个圈输出yes,否则输出no
反思:没理解清楚题意,做题时认为最小编号不一定为1,也不一定是++或–导致有太多的情况(其实也没太多情况,只是因为自己菜)
思路:vector存序列找1,循环查找j=(j+1)%a.size();&传入参数减少了清空以及定义vector的步骤
首先判断正向是否为递增,然后判断反向是否为递增利用 | 运算符判断是否能围成圈(我不会写就是因为不知道如何判断升序降序)
下面是ac代码
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<vector>
#define ll long long
using namespace std;
bool ok(vector<int> &a){
for(int i=0;i<a.size();i++){
if(a[i]==1){
for(int j=i,v=1;v<=a.size();++v,j=(j+1)%a.size()){
if(a[j]!=v){
return false;
}
}
break;
}
}
return true;
}
int main(){
int _;
scanf("%d",&_);
while(_--){
int n;
scanf("%d",&n);
vector<int>a(n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
bool yes=ok(a);
reverse(a.begin(),a.end());
yes|=ok(a);
if(yes){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}