P5438No.41 泥睡魔兽睡梦貘 入门 彩虹周赛 标准IO 传统题 时间限制 1000ms 内存限制 256MB 来源 TomAnderson 题目描述 睡梦貘想要早起,于是它设了个闹钟。但它睡的实在是太死了,在睡到 12 : 00 12:00 之前,区区闹钟根本叫不醒它。 这个闹钟有重复提醒功能。当到达设定的时间点时,闹钟会首次响起。闹钟会响 5 5 分钟,然后消停 5 5 分钟,然后再响 5 5 分钟,如此循环往复,直到闹钟被关闭。严格来说,从设定时间开始的每 10 10 分钟为一个周期:第 [ 0 , 5 ) [0,5) 分钟闹钟在响,第 [ 5 , 10 ) [5,10) 分钟停止,依此类推。 请你计算,睡梦貘会在闹钟响第几次的时候被叫醒。 输入格式 第一行输入一个正整数 T T,表示测试数据组数。 对于每组测试数据: 输入一行,表示闹钟设定的时间,以 H H : M M HH:MM 的形式给出,可能有前导零,保证早于 12 : 00 12:00。 输出格式 输出 T T 行,每行一个整数,表示答案。 input1 复制代码 4 11:59 11:55 11:54 11:50 output1 复制代码 1 2 2 2 数据范围 对于 100 % 100% 的数据,保证 1 ⩽ T ⩽ 60 1⩽T⩽60, 00 ⩽ H H < 12 00⩽HH<12, 00 ⩽ M M < 60 00⩽MM<60。 下发样例 C++
时间: 2025-03-22 15:06:38 浏览: 69
### 实现思路
要解决这个问题,可以利用 C++ 中 `std::condition_variable` 和 `std::mutex` 来模拟线程间的同步操作。具体来说:
1. 使用 `std::chrono` 提供的时间功能来设置闹钟触发时间。
2. 利用 `std::this_thread::sleep_until` 或者 `std::condition_variable::wait_for/wait_until` 方法让主线程进入等待状态直到指定时间到达。
3. 记录每次唤醒事件并统计总的叫醒次数。
以下是完整的解决方案代码示例以及解释:
```cpp
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
// 定义全局变量用于记录唤醒次数
int wake_count = 0;
// 创建互斥量和条件变量对象
std::mutex mtx;
std::condition_variable cv;
void alarm(const std::chrono::steady_clock::time_point& trigger_time) {
// 锁定互斥量
std::unique_lock<std::mutex> lock(mtx);
// 等待直到触发时间到来
auto status = cv.wait_until(lock, trigger_time);
if (status == std::cv_status::timeout) { // 如果是因为超时才退出
++wake_count; // 增加唤醒计数器
std::cout <
阅读全文
相关推荐

















