I Sequence Of Number

I Sequence Of Number
时间限制 内存限制 出题人 1 Second 512 Mb
题目描述
有一个由n个数组成的数列,但其中缺少一项,请你任意添加该项,使整个数列的值y和下标x (1 : n)满足函数:y = kx + b. 其中k,b是不为0的整数. 如果满足,输出YES,并输出数列缺少的那一项的最小值,否则,输出NO. ps: 数列是由一列有序的正整数组成的连续数字.
输入 第一行一个T,表示T组测试数据.(1 ≤ T ≤ 100) 每一组数据分两行,第一行一个整数 N,第二行是由N−1个数组成的正整数数列. (1 ≤ N ≤ 3) 输入的所有数据不超过int,且为正整数.
输出
若满足输出YES,并输出数列缺少的最小数字,否则输出NO.
输入样例
1 2 3
输出样例
YES 1
样例解释
输入数3的下标可能是1 or 2,当是1的时候,缺项可以是1 2 4 5 7...取最小值为1;当下标为2的 时候,缺项可以是1 2 4 5 6 7...取最小值为

#include<stdio.h>
#include<string.h>
typedef long long ll;
ll a[1000000];
int main()
{
	int t;
	scanf("%d",&t);
	while (t--)
	{
		int i,n;
		memset(a,0,sizeof(0));
		scanf("%d",&n);
		for (i=1;i<n;i++)
			scanf("%lld",&a[i]);
		if (n==1)
			printf("YES 1\n");
			
		else if (n==2)//只有两项
			{
				if (a[1]==1)
					printf("YES 2\n");
				else
					printf("YES 1\n");
			}
				
		else if (n==3)
		{
			ll ans,cnt = -1;
			ans = a[2] - a[1];//ans可理解为“公差”。
			if (ans>0)//增序列
			{
				if (a[1]-ans>0 && a[1]-ans!=ans)//在左下
					cnt = a[1] - ans;
				else if (ans%2==0 && a[1]-ans/2!=0)//在中间
					cnt = a[1] + ans/2;
				else if (a[1]-ans!=0)在右上
					cnt = a[2] + ans;
			}
			else if (ans<0)
			{
				if (a[2]+ans>0)//在右下
					cnt = a[2] + ans;
				else if (ans%2==0)//在中间
					cnt = a[1] + ans/2;
				else//在左上
					cnt = a[1] - ans;
			}
			if (cnt==-1)
				printf("NO\n");
			else
				printf("YES %lld\n",cnt);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40912854/article/details/81176884