2 3 1 3 2 4 3 2 4 1
N Y
思路:
对于一个1到n的排列,如果前K个数里没有X,那么剩余的数里一定含有X。
从它给的式子我们可以知道2P[i2]=P[i1]+P[i3],即P[i1]和P[i3]关于P[i2]对称。
首先将h数组标记为0,之后读入元素x,每读入一个元素,就将该元素对应的下标的h数组赋值为1。接着我们在h数组中以该元素的对称前方和后方找,即h[x-j]和h[x+j],如果h[x+j]+h[x-j]==1,那么就找到了序列。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int h[20010];//记录1到n是否出现了,出现了记为1。 int main() { int t,n,i,j,x; scanf("%d",&t); while(t--) { int flag=0; scanf("%d",&n); memset(h,0,sizeof(h)); for(i=1;i<=n;i++) { scanf("%d",&x); h[x]=1; if(flag) continue; for(j=1;x-j>0&&x+j<=n;j++) { if(h[x-j]+h[x+j]==1)//p[i1],p[i3]之中出现一个 { flag=1;break; } } } if(flag) printf("Y\n"); else printf("N\n"); } return 0; }