hdu 3833 YY's new problem

3 篇文章 0 订阅

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


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
 

思路:

对于一个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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值