题意:给定一个长为n的(0,1,2....n-1)的排列,问是否存在等差数列。
题解:可以记录每个数出现的位置pos[i],枚举等差数列中间项以及公差,判断(pos[i+d]-pos[i])*(pos[i-d]-pos[i])是否小于0。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10005;
int pos[N];
int main()
{
int n,f;
while(scanf("%d",&n),n)
{
getchar();
for(int i=0,tp;i<n;i++)
{
scanf("%d",&tp);
pos[tp]=i;
}
f=0;
for(int i=1;!f&&i<n-1;i++)
for(int j=1,lim=min(n-1-i,i);!f&&j<=lim;j++)
if((pos[i+j]-pos[i])*(pos[i-j]-pos[i])<0)
f=1;
printf("%s\n",f?"no":"yes");
}
return 0;
}