YY's new problem
Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 5443 Accepted Submission(s): 1530
P[i1]-P[i2]=P[i2]-P[i3], 1<=i1<i2<i3<=N.
Each test case comes two lines, the former one is N, 3<=N<=10000, the latter is a permutation of 1 to N.
思路:
對於一個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;
}