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;
}