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
题意:就是找出数列中是否有满足P[i1]-P[i2]=P[i2]-P[i3], 1<=i1<i2<i3<=N.的存在
思路:今天看到学姐,也是我以前队友在群里问,于是无聊就去做下,其实还是很简单的,由于只有1~N,所以我们很容易联想到哈希,用哈希记录位置,原式可化为2*p2 = p1+p3,所以我们可以用过p1+p3来获得p2地址,看是否在p1,p3中间
光是这样还是会超时,那么我们再来个优化,可以发现p1+p3必然是偶数,这是最重要的优化之处
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[10005];
int hash[10005];
int main()
{
int t,n,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i = 0; i<n; i++)
{
scanf("%d",&a[i]);
hash[a[i]] = i;
}
int flag = 0;
for(i = 0; i<n; i++)
{
for(j = i+1; j<n; j++)
{
int s = a[i]+a[j];
if(s%2)//奇数肯定不符合
continue;
if(hash[s/2]>i && hash[s/2]<j)
{
flag = 1;
break;
}
}
if(flag)
break;
}
printf("%s\n",flag?"Y":"N");
}
return 0;
}