YY's new problem
Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3501 Accepted Submission(s): 984
Problem Description
Given a permutation P of 1 to N, YY wants to know whether there exists such three elements P[i
1], P[i
2], P[i
3] that
P[i 1]-P[i 2]=P[i 2]-P[i 3], 1<=i 1<i 2<i 3<=N.
P[i 1]-P[i 2]=P[i 2]-P[i 3], 1<=i 1<i 2<i 3<=N.
Input
The first line is T(T<=60), representing the total test cases.
Each test case comes two lines, the former one is N, 3<=N<=10000, the latter is a permutation of 1 to N.
Each test case comes two lines, the former one is N, 3<=N<=10000, the latter is a permutation of 1 to N.
Output
For each test case, just output 'Y' if such i
1, i
2, i
3
can be found, else 'N'.
Sample Input
2 3 1 3 2 4 3 2 4 1
Sample Output
N Y
思路:1到n每个元素只会出现一次,引入hash[]来记录该数是否已经出现,出现为1,否则为0 ;
读入一个数t ,从1到t-1依次判断是否有hash[t-i]+hash[t+i]==1
即以t为中项,
对于t-i,t+i是否仅出现过一个,由于是按顺序读入的,即可保证t-i和t+i在原序列中一定是在t的两边
#include"stdio.h"
#include"string.h"
#define N 10005
int main()
{
int T,t,n,i,m,flag,hash[N];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(hash,0,sizeof(hash));
m=n;
flag=0;
while(m--)
{
scanf("%d",&t);
hash[t]=1;
for(i=1;!flag&&i<t&&t+i<=n;i++)
{
if(hash[t-i]+hash[t+i]==1) //这两个元素有且只有一个出现
flag=1;
}
}
if(flag)
printf("Y\n");
else
printf("N\n");
}
return 0;
}