智算之道初赛第二场 第一题 声控灯

A.声控灯

http://oj.csen.org.cn/contest/6/17

题目描述

小明正在上楼梯,当小明逐渐接近某层楼的时候,这层楼的声控灯检测到小明的脚步声便会亮起来,当小明逐渐远去的时候,声控灯由于一段时间内没检测到声音又会灭下去。
由于小明是匀速上楼的,而且他的速度把控得刚刚好,脚步声的音量也十分恰当,使得灯的亮灭呈现出这样的状态:他当前所在的楼层的声控灯是亮起的,他即将抵达的下一层楼的声控灯是亮起的,他刚刚离开的那层楼的声控灯也是亮起的。
现在你站在楼的外面,通过窗户看到了灯的亮灭状态,请推断小明现在在几楼?

输入格式

每个测试点包含以下内容:
第一行给出一个整数 T,表示接下来给出 T 组测试数据
每组测试数据包含两行
第一行包含两个数 n , m 表示这栋楼一共有 n 层,当前有 m 盏灯是亮起的,而其余灯都是熄灭的
第二行包含 m 个整数,这些整数按照从小到大的顺序给出亮起的灯的序号
保证输入数据是符合实际情况的

输出格式

输出 T 行,每行包含一个数字,按照输入的顺序依次给出每组测试数据的答案。如果答案不确定,请输出 -1−1

数据规模与约定

对于 50% 的数据,1 ≤ T ≤ 10, 3 ≤ n ≤ 100, m=3
对于100% 的测试点,1 ≤ T ≤ 1000,1 ≤ n ≤ 109 ,1 ≤ m ≤ 3

样例输入

2
5 3
1 2 3
5 2
1 2

样例输出

2
1

这道题又水又坑,真的是绝了,分类讨论
50分和100分的差距就在于一小段代码
有没有判断m=1的情况
话说这种情况属于没有走进楼,没有进楼怎么能算一楼呢?
下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long t,n,m,a[5]={0};
	scanf("%lld",&t);
	while(t--)
	{
		long long f1=0,fn=0;
		a[1]=0;a[2]=0;a[3]=0;
		scanf("%lld%lld",&n,&m);
		for(long long i=1;i<=m;i++)
		{
			scanf("%lld",&a[i]);
		}
		if(m==3&&a[1]+1==a[2]&&a[2]+1==a[3])
		{
			printf("%lld\n",a[2]);
			continue;
		}
		if(m==2)
		{
			if(n==2)
			{
				printf("-1\n");
				continue;
			}
			if(a[1]==1&&a[2]==2)
			{
				printf("1\n");
				continue;
			}
			if(a[2]==n&&a[1]==n-1)
			{
				printf("%lld\n",n);
				continue;
			}
		}
		if(m==1&&a[1]==1)
		{
			printf("1\n");
			continue;
		}
		printf("-1\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43813647/article/details/107453214