Antiarithmetic?

Antiarithmetic?

时间: 1ms        内存:128M

描述:

A permutation of n is a bijective function of the initial n natural numbers: 0, 1, ... n-1. A permutation p is called antiarithmetic if there is no subsequence of it forming an arithmetic progression of length bigger than 2, i.e. there are no three indices 0 ≤ i < j < k < n such that (pi , pj , pk) forms an arithmetic progression.

 

For example, the sequence (2, 0, 1, 4, 3) is an antiarithmetic permutation of 5. The sequence (0, 5, 4, 3, 1, 2) is not an antiarithmetic permutation as its first, fifth and sixth term (0, 1, 2) form an arithmetic progression; and so do its second, forth and fifth term (5, 3, 1).

Your task is to check whether a given permutation of n is antiarithmetic.

There are several test cases, followed by a line containing 0. Each test case is a line of the input file containing a natural number 3 ≤ n ≤ 10000 followed by a colon and then followed by n distinct numbers separated by whitespace. All n numbers are natural numbers smaller than n.

For each test case output one line with yes or no stating whether the permutation is antiarithmetic or not.

输入:

Please Input Input Here

输出:

Please Input Output Here

示例输入:

3: 0 2 1 
5: 2 0 1 3 4
6: 2 4 3 5 0 1
0

示例输出:

yes
no
yes

提示:

参考答案(内存最优[964]):

#include <stdio.h>
int main()
{
	int n,i,k=0,j,nn[10001],f[10001];
	while(scanf("%d:",&n))
	{
		if(n==0)break;
		for(i=0;i<n;i++)
		{
			scanf("%d",&f[i]);
		}
		for(i=0;i<n;i++)
		{
			nn[f[i]]=i;
		}
		for(i=0;k!=1&&i<n-1;i++)
		{
			for(j=i+1;k!=1&&j<n;j++)
			{if(2*j-i>=n)
			{break;}
				if((nn[i]<nn[j])&&(nn[j]<nn[2*j-i]))
				{
					printf("no\n");
					k=1;
				}
				if((nn[i]>nn[j])&&(nn[j]>nn[2*j-i]))
				{printf("no\n");
					k=1;
				}
			}
		}
		if(k==0)
		{
			printf("yes\n");
		}
		k=0;
	}
	return 0;
}

参考答案(时间最优[4]):

#include <stdio.h>
int main()
{
	int n,i,k=0,j,nn[10001],f[10001];
	while(scanf("%d:",&n))
	{
		if(n==0)break;
		for(i=0;i<n;i++)
		{
			scanf("%d",&f[i]);
		}
		for(i=0;i<n;i++)
		{
			nn[f[i]]=i;
		}
		for(i=0;k!=1&&i<n-1;i++)
		{
			for(j=i+1;k!=1&&j<n;j++)
			{if(2*j-i>=n)
			{break;}
				if((nn[i]<nn[j])&&(nn[j]<nn[2*j-i]))
				{
					printf("no\n");
					k=1;
				}
				if((nn[i]>nn[j])&&(nn[j]>nn[2*j-i]))
				{printf("no\n");
					k=1;
				}
			}
		}
		if(k==0)
		{
			printf("yes\n");
		}
		k=0;
	}
	return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注