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下
关键观察
- 分钟判断:只有当分钟为0时才敲钟,否则不敲(输出0)
- 小时转换:
- 12点整(H=12):24下
- 午夜0点(H=0):12下
- 其他时间:
- 1-11点:H+12下
- 13-23点:H-12下
算法设计
- 输入处理:
- 读取测试用例数量T
- 对每个测试用例,读取时间(格式为H:M)
- 分钟检查:
- 如果M≠0,直接输出0
- 小时处理:
- H=0 → 12
- H=12 → 24
- 其他:
- 使用公式:(H+12)%24
- 这个公式能正确处理1-11点(得13-23)和13-23点(得1-11)
- 输出结果:根据上述规则输出敲击次数
复杂度分析
- 时间复杂度:O(T),每个测试用例只需常数时间处理
- 空间复杂度:O(1),只使用固定数量的变量
示例验证
以输入样例验证:
- 1:00 → (1+12)%24=13
- 01:01 → 分钟非0 → 0
- 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
- 上传者