Hướng dẫn giải của Múi giờ


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.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, sussyboy, PhucHung2011, lephuochauhungvuong

Hiểu bài toán

Bài toán yêu cầu chuyển đổi thời gian từ múi giờ GMT+a sang múi giờ GMT+b. Với giờ và phút đầu vào là h và m tại múi giờ nguồn, ta cần tìm giờ và phút tương ứng tại múi giờ đích. Múi giờ được xác định bằng số giờ chênh lệch so với Greenwich Mean Time (GMT). Ví dụ, GMT+2 chênh lệch +2 giờ so với GMT, GMT-3 chênh lệch -3 giờ. Quy đổi thời gian giữa hai múi giờ chỉ đơn giản là cộng hoặc trừ đi hiệu số múi giờ (b - a) vào giờ hiện tại, sau đó chuẩn hóa kết quả về khoảng [0, 23] cho giờ và [0, 59] cho phút.

Các cách tiếp cận

Cách Phương pháp xử lý điều kiện
#include<bits/stdc++.h>
using namespace std;
int h,m,a,b; 
int main()
{
    cin>>h>>m>>a>>b;
    h = h - a + b;
    if (h < 0) h += 24;
    if (h > 23) h -= 24;
    cout<<h<<" "<<m;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Cách tiếp cận này sử dụng các câu lệnh điều kiện if để kiểm tra và điều chỉnh giờ sau khi tính toán. Bước đầu tiên là tính giờ mới bằng cách lấy giờ đầu vào (h) trừ đi múi giờ nguồn (a) và cộng thêm múi giờ đích (b), suy ra giờ tại Greenwich rồi quy về múi đích. Nếu kết quả giờ âm (ví dụ -1), ta cộng thêm 24 để có giá trị dương (ví dụ 23). Nếu kết quả lớn hơn 23 (ví dụ 24), ta trừ đi 24. Phương pháp này dễ hiểu và trực quan.

Cách Phương pháp Toán học (Modulo)
#include <bits/stdc++.h>
using namespace std;

int main() {
    int h, m, a, b;
    cin >> h >> m >> a >> b;
    h = h + b - a;
    cout << (h + 24) % 24 << ' ' << m;
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là cách hiệu quả và ngắn gọn hơn bằng cách sử dụng toán tử Modulo (%). Công thức tính chênh lệch múi giờ là delta = b - a. Giờ mới = h + delta. Để đưa giờ về khoảng [0, 23] trong mọi trường hợp (kể cả khi giờ là số âm), ta cộng thêm một bội số đủ lớn của 24 (ví dụ 24 hoặc 48) trước khi lấy phần dư. Cụ thể, (h + delta + 24) % 24 sẽ luôn trả về kết quả dương nằm trong khoảng [0, 23]. Ví dụ: nếu h=0, delta=-1 (tức -1), (-1 + 24) % 24 = 23. Nếu h=23, delta=1 (tức 24), (24 + 24) % 24 = 24 % 24 = 0.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(1) O(1) Phương pháp xử lý điều kiện
2 O(1) O(1) Phương pháp Toán học (Modulo)

Bài học kinh nghiệm

  • Vấn đề cốt lõi là tìm hiệu số múi giờ b - a và cộng vào giờ hiện tại. Phút không thay đổi.
  • Giờ luôn nằm trong khoảng [0, 23]. Nếu tính toán bị âm hoặc vượt quá 23, cần phải chuẩn hóa (bằng cách cộng/trừ 24).
  • Công thức (x % n + n) % n là một kỹ thuật phổ biến để đảm bảo kết quả phép chia lấy dư luôn dương, áp dụng tốt ở đây với n=24.

Lỗi thường gặp

  • Quên xử lý trường hợp giờ bị âm sau khi trừ múi giờ.
  • Sử dụng phép chia lấy dư thông thường (%) ở một số ngôn ngữ (như C++/Java) cho số âm sẽ trả về số âm, dẫn đến sai kết quả nếu không xử lý trước (ví dụ -1 % 24 = -1).
  • Lầm tưởng múi GMT+x có thể là số âm (ví dụ GMT-5) và cách tính toán sai dấu khi cộng trừ.

Bình luận

Please read the guidelines before commenting.


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