关于计蒜客2020年10月的热身赛c题
小明正在上楼梯,当小明逐渐接近某层楼的时候,这层楼的声控灯检测到小明的脚步声便会亮起来,当小明逐渐远去的时候,声控灯由于一段时间内没检测到声音又会灭下去。
由于小明是匀速上楼的,而且他的速度把控得刚刚好,脚步声的音量也十分恰当,使得灯的亮灭呈现出这样的状态:他当前所在的楼层的声控灯是亮起的,他即将抵达的下一层楼的声控灯是亮起的,他刚刚离开的那层楼的声控灯也是亮起的。
现在你站在楼的外面,通过窗户看到了灯的亮灭状态,请推断小明现在在几楼?
输入格式
每个测试点包含以下内容:
第一行给出一个整数 T,表示接下来给出 T 组测试数据
每组测试数据包含两行
第一行包含两个数 n,m,n表示这栋楼一共有 n 层,当前有m 盏灯是亮起的,而其余灯都是熄灭的
第二行包含 m 个整数,这些整数按照从小到大的顺序给出亮起的灯的序号
保证输入数据是符合实际情况的
输出格式
输出 T 行,每行包含一个数字,按照输入的顺序依次给出每组测试数据的答案。如果答案不确定,请输出 -1
数据规模与约定
对于 100%的测试点,1≤m≤3,1≤n≤10^9
这是我第一次做这个题 所以解法其实比较麻烦 但是看网上的解析都是先判断m在讨论n 特意来写一下
首先我们需要将事件分成以下几个可能的大类
n==1 一层楼只能亮起一盏灯 则m!=1则输出-1
n==2 此时的你无论是在一楼还是二楼都会亮起两盏灯 无论如何都不能准确的确定你当前所在的位置 所以当n=2时可以直接输出-1
n≥3 此时又要将事件分成两个大类 即人在楼层中或者顶\底楼。当你在楼层之中 很简单 我们只需要中间的数值就是你所在的楼层,但如果你在顶楼或者底楼 就会亮起两盏灯 我们需要结合情况来确定你到底在几楼 因为需要保证AC 我就把所有情况都列出来了 应该看起来比较冗杂
下面是AC代码
#include <stdio.h>
main()
{
int T;
scanf("%d", &T);
while (T--)
{
int m,n;
scanf("%d%d", &n, &m);
if(n==1&&m==1)
{
int a;
scanf("%d",&a);
printf("%d\n",a);
}
else if(n==1&&m==2)
{ int a,b;
scanf("%d%d",&a,&b);
printf("-1\n");
}
else if(n==1&&m==3)
{ int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("-1\n");
}
else if(n==2&&m==1)
{
int a;
scanf("%d",&a);
printf("-1\n");
}
else if(n==2&&m==2)
{
int a,b;
scanf("%d%d",&a,&b);
printf("-1\n");
}
else if(n==2&&m==3)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("-1\n");
}
else if(n>=3&&m==2)
{
int a,b;
scanf("%d%d",&a,&b);
if(a==1) printf("1\n");
else if(b==n) printf("%d\n",n);
}
else if(n>=3&&m==3)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",b);
}
else if(n>=3&&m==1)
{ int a;
scanf("%d",&a);
printf("-1\n");
}
}
return 0;
}