hdu 【3833】YY's new problem

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.
 

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.
 

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
2011 Multi-University Training Contest 1 - Host by HNU
 

Recommend
xubiao   |   We have carefully selected several similar problems for you:   3835  3831  3834  3828  3830 

//本题利用了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;
}

你可能感兴趣的:(hdu 【3833】YY's new problem)