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