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.
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:11 và 22: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:0011:1122:22
- Khoảng cách giữa các mốc (tính từ
23:59):- Từ
23:59đến00:00kế tiếp: \(1\) phút. - Từ
00:00đến11:11: \(11 \times 60 + 11 = 671\) phút. - Từ
11:11đến22:22: \(11 \times 60 + 11 = 671\) phút. - Từ
22:22đến00:00hôm sau: \((23-22) \times 60 + (60-22) = 60 + 38 = 98\) phút.
- 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à:
00:00\(\to\)11:11: \(671\) phút.11:11\(\to\)22:22: \(671\) phút.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
- Tính số chu kỳ ngày hoàn chỉnh:
so_ngay = N // 1440. - Số thời điểm đẹp chắc chắn có được:
ans = so_ngay * 3. - Xét phần dư còn lại sau các chu kỳ ngày:
du = N % 1440. - 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ốc00:00(tổng cộng +1). - Nếu
du >= 1 + 671 = 672: Có thêm mốc11:11(tổng cộng +2). - Nếu
du >= 672 + 671 = 1343: Có thêm mốc22:22(tổng cộng +3).
- Nếu
Độ 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 để đến11: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:59rất quan trọng để xác định phần dư.
Bình luận