Hướng dẫn giải của [200 đề thầy Đức] Bài 31: Đồng hồ báo thức


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Đặt báo thức lúc hh:mm - x·y phút (quay vòng qua 24 giờ), rồi kiểm tra xem thời điểm đó có chữ số 7 không. Ta thử lần lượt y = 0, 1, 2, ... và dừng ở y đầu tiên thỏa mãn. Vì x·y chỉ có 1440 giá trị khác nhau mod 1440 nên đáp án luôn nhỏ hơn 1440.

Bài này chỉ cần thử trực tiếp như trên: mỗi lần kiểm tra là O(1). Vì vậy chỉ viết 1 sub (lời giải đầy đủ), không cần cách tối ưu khác. Đạt 254/254 test.

Sub 1: Thử trực tiếp từng số lần nhấn — ~O(1440)~
#include <bits/stdc++.h>
using namespace std;

// Kiem tra thoi diem (tinh bang phut trong ngay) co chua chu so 7 hay khong
bool mayMan(int t) {
    int hh = t / 60, mm = t % 60;
    int d[4] = {hh / 10, hh % 10, mm / 10, mm % 10};
    for (int k = 0; k < 4; k++)
        if (d[k] == 7) return true;
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int x, hh, mm;
    cin >> x >> hh >> mm;
    int target = hh * 60 + mm;
    // Thu y = 0, 1, 2, ...: dat bao thuc luc (target - x*y) phut (vong 24 gio)
    // Sau 1440 gia tri cua y thi cac thoi diem bi lap lai, nen dap an nho hon 1440
    for (int y = 0; ; y++) {
        int t = ((target - x * y) % 1440 + 1440) % 1440;
        if (mayMan(t)) {
            cout << y << "\n";
            break;
        }
    }
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.