1 条题解

  • 0

    解题思路

    问题理解

    我们需要计算教堂大钟在当前时间会敲击的次数。大钟的敲击规则如下:

    • 仅在整点(分钟为0)时敲钟
    • 敲击次数与小时数的关系:
      • 12:00 → 24下
      • 1:00 → 13下
      • 2:00 → 14下
      • ...
      • 11:00 → 23下
      • 12:00 → 24下
      • 13:00(即下午1点)→ 1下
      • 14:00 → 2下
      • ...
      • 23:00 → 11下
      • 0:00(午夜)→ 12下

    关键观察

    1. 分钟判断:只有当分钟为0时才敲钟,否则不敲(输出0)
    2. 小时转换
      • 12点整(H=12):24下
      • 午夜0点(H=0):12下
      • 其他时间:
        • 1-11点:H+12下
        • 13-23点:H-12下

    算法设计

    1. 输入处理
      • 读取测试用例数量T
      • 对每个测试用例,读取时间(格式为H:M)
    2. 分钟检查
      • 如果M≠0,直接输出0
    3. 小时处理
      • H=0 → 12
      • H=12 → 24
      • 其他:
        • 使用公式:(H+12)%24
        • 这个公式能正确处理1-11点(得13-23)和13-23点(得1-11)
    4. 输出结果:根据上述规则输出敲击次数

    复杂度分析

    • 时间复杂度:O(T),每个测试用例只需常数时间处理
    • 空间复杂度:O(1),只使用固定数量的变量

    示例验证

    以输入样例验证:

    1. 1:00 → (1+12)%24=13
    2. 01:01 → 分钟非0 → 0
    3. 00:00 → 特殊处理 → 12

    边界情况

    • 午夜0:00 → 12
    • 中午12:00 → 24
    • 分钟非0 → 0
    • 13:00 → (13+12)%24=1
    • 23:00 → (23+12)%24=11

    这个解法通过简单的条件判断和模运算,高效地解决了问题,适用于给定的所有情况。

    标程

    #include <cstdio>
    
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	
    	int T;
    	scanf("%d", &T);
    	
    	int H, M;
    	char point;
    	while (T--)
    	{
    		scanf("%d%c%d", &H, &point, &M);  // 关键处理:读取小时、冒号、分钟
    		
    		if (M != 0)
    		{
    			printf("0\n");
    		}
    		else
    		{
    			if (H == 12)
    			{
    				printf("24\n");
    			}
    			else
    			{
    				printf("%d\n", (H + 12) % 24);
    			}
    		}
    	}
    	
    	return 0;
    }
    • 1

    信息

    ID
    1840
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者