题目:Stay up Late and Wake up Early
来源:第三届中国计量大学ACM程序设计竞赛个人赛(同步赛)

解题思路

Gyro 需要在 hh:mm 时间起床,他在“幸运时间”设置闹钟,闹钟每隔 x 分钟响一次,如果没到起床时间,Gyro 就按一次睡眠按钮。
求按睡眠按钮的最少次数 y,并输出幸运时间。
幸运时间定义:包含数字 7。闹钟设置为 24 小时,23:59 后一秒的时间为 00:00

数字 7 只能出现在 minute 的个位数上或者 hour 的个位数上。
将当前时间减去 x 分钟,直至得到的时间是幸运时间为止。

C++代码

#include<iostream>
using namespace std;

string luckyTime(int x, string time){
    int hour = stoi(time.substr(0, 2));
    int minute = stoi(time.substr(3, 2));
    int y = 0;
    while(minute % 10 != 7 && hour % 10 != 7){
        if(minute >= x)
            minute -= x;
        else{
            minute += 60;
            minute -= x;
            hour += 24;
            hour -= 1;
            hour %= 24;
        }
        ++y;
    }
    string ans = to_string(y) + " ";
    string sh = to_string(hour);
    if(sh.size() == 1)
        sh = "0" + sh;
    ans += sh + ":";
    string sm = to_string(minute);
    if(sm.size() == 1)
        sm = "0" + sm;
    ans += sm;
    return ans;
}

int main(){
    int T;
    cin >> T;
    while(T){
        int x;
        string wakeTime;
        cin >> x >> wakeTime;
        cout << luckyTime(x, wakeTime) << endl;
        --T;
    }
    return 0;
}