关于声控灯(计蒜客热身赛C题)

关于计蒜客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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值