Hướng dẫn cho Thời điểm đẹp


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Tóm tắt đề bài

Một đồng hồ LED hiển thị thời gian từ 00:00 đến 23:59. Một "thời điểm đẹp" được định nghĩa là thời điểm mà cả 4 chữ số trên đồng hồ đều giống nhau. Trong một ngày có 3 thời điểm đẹp là: 00:00, 11:1122:22.

Bắt đầu tính từ thời điểm 23:59, sau \(N\) phút, hãy cho biết đã có bao nhiêu lần thời điểm đẹp xuất hiện.

Phân tích

  • Các mốc thời gian đẹp:
    • 00:00
    • 11:11
    • 22:22
  • Khoảng cách giữa các mốc (tính từ 23:59):
    • Từ 23:59 đến 00:00 kế tiếp: \(1\) phút.
    • Từ 00:00 đến 11:11: \(11 \times 60 + 11 = 671\) phút.
    • Từ 11:11 đến 22:22: \(11 \times 60 + 11 = 671\) phút.
    • Từ 22:22 đến 00:00 hôm sau: \((23-22) \times 60 + (60-22) = 60 + 38 = 98\) phút.
  • Chu kỳ: Một ngày có tổng cộng \(1440\) phút (\(24 \times 60\)). Trong một chu kỳ 1440 phút này, luôn có đúng 3 thời điểm đẹp.
  • Ràng buộc: \(N \leq 10^9\) là một số rất lớn, vì vậy ta không thể mô phỏng từng phút. Tuy nhiên, vì tính chất chu kỳ của đồng hồ, ta có thể giải quyết bằng toán học trong \(O(1)\).

Hướng giải quyết

Nhận xét quan trọng

Vì chúng ta bắt đầu từ 23:59, phút đầu tiên (\(N=1\)) sẽ đưa đồng hồ đến 00:00, đây là thời điểm đẹp đầu tiên.
Khoảng cách giữa các thời điểm đẹp liên tiếp là:

  1. 00:00 \(\to\) 11:11: \(671\) phút.
  2. 11:11 \(\to\) 22:22: \(671\) phút.
  3. 22:22 \(\to\) 00:00: \(98\) phút.

Tổng chu kỳ: \(671 + 671 + 98 = 1440\) phút (đúng bằng 1 ngày).

Thuật toán

  1. Tính số chu kỳ ngày hoàn chỉnh: so_ngay = N // 1440.
  2. Số thời điểm đẹp chắc chắn có được: ans = so_ngay * 3.
  3. Xét phần dư còn lại sau các chu kỳ ngày: du = N % 1440.
  4. Kiểm tra phần dư này có thể chứa thêm bao nhiêu thời điểm đẹp:
    • Nếu du >= 1: Có thêm mốc 00:00 (tổng cộng +1).
    • Nếu du >= 1 + 671 = 672: Có thêm mốc 11:11 (tổng cộng +2).
    • Nếu du >= 672 + 671 = 1343: Có thêm mốc 22:22 (tổng cộng +3).

Độ phức tạp

  • Thời gian: \(O(1)\) vì chỉ sử dụng các phép toán số học cơ bản.
  • Bộ nhớ: \(O(1)\).

Code tham khảo

Cách 1: Sử dụng toán học (Tối ưu nhất)

Python
import sys

def solve():
    try:
        line = sys.stdin.readline()
        if not line:
            return
        n = int(line.strip())
    except EOFError:
        return

    # Một ngày có 1440 phút và có 3 thời điểm đẹp
    so_ngay = n // 1440
    ans = so_ngay * 3

    du = n % 1440

    # Kiểm tra các mốc trong phần dư
    # Mốc 1: 00:00 (cần 1 phút từ 23:59)
    if du >= 1:
        ans += 1
    # Mốc 2: 11:11 (cần thêm 671 phút từ 00:00)
    if du >= 672:
        ans += 1
    # Mốc 3: 22:22 (cần thêm 671 phút từ 11:11)
    if du >= 1343:
        ans += 1

    print(ans)

if __name__ == "__main__":
    solve()

Cách 2: Mô phỏng theo mốc thời gian (Dựa trên code AC)

Python
n = int(input())
if n == 0:
    print(0)
else:
    count = 0
    # a đại diện cho thứ tự thời điểm đẹp: 
    # a % 3 == 1: 00:00
    # a % 3 == 2: 11:11
    # a % 3 == 0: 22:22
    a = 1
    while n > 0:
        # Khoảng cách cần thiết để đến thời điểm đẹp tiếp theo
        if a % 3 == 1:
            dist = 1 if a == 1 else 98 # Từ 23:59 đến 00:00 hoặc 22:22 đến 00:00
        else:
            dist = 671 # Từ 00:00 -> 11:11 hoặc 11:11 -> 22:22

        if n >= dist:
            count += 1
            n -= dist
            a += 1
        else:
            break
    print(count)

Giải thích thêm về ví dụ 3:

  • \(N = 3000\)
  • \(3000 // 1440 = 2\) ngày \(\to 2 \times 3 = 6\) thời điểm đẹp.
  • \(3000 \% 1440 = 120\) phút còn dư.
  • Trong \(120\) phút này, phút thứ 1 là 00:00 (thêm 1 lần), nhưng chưa đủ \(672\) phút để đến 11:11.
  • Tuy nhiên, trong ví dụ 3 kết quả là 6, điều này khớp với logic tính toán chu kỳ. Lưu ý cách tính mốc bắt đầu 23:59 rất quan trọng để xác định phần dư.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.