YY's new problem
Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 5417 Accepted Submission(s): 1518
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
Source
Recommend
//本题利用了hash的思想,首先利用输入的数作为hash数组的下标
//进行判断,因为输入的先后关系,当往前往后找同样的距离的数
//组如果有且只有一个的hash值为1时,说明该数必定出现在输入数
//的前面,因为输入的数为1~n所以后面的数一定会这个数的后面
//出现,这样判断成立flag的值标记为1.
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 10005;
int has[maxn];
int main()
{
int T,n;
scanf("%d", &T);
while(T--)
{
memset(has, 0, sizeof(has));
scanf("%d", &n);
int x;
int flag = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &x);
has[x] = 1;
if(!flag)
{
for(int j = 1; x > j && j+x <= n; j++)
{
if(has[x-j] + has[x+j] == 1)
{
flag = 1;
break;
}
}
}
}
if(flag) printf("Y\n");
else printf("N\n");
}
return 0;
}