Hướng dẫn giải của Iroha và Haiku
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ậpTác giả: , , ,
Hiểu bài toán
Bài toán yêu cầu kiểm tra xem ba số nguyên A, B, C nhập vào có thể tạo thành một bài thơ Haiku hay không. Một bài Haiku yêu cầu ba câu có độ dài lần lượt là 5, 7 và 5 ký tự. Tuy nhiên, thứ tự các câu trong input không quan trọng. Do đó, bài toán trở thành: Kiểm tra xem bộ ba số {A, B, C} có chứa đúng hai số 5 và một số 7 hay không.
Các cách tiếp cận
Cách Đếm số lượng (Counting)
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long A, B, C;
cin >> A >> B >> C;
int five = 0, seven = 0;
if (A == 5) five++;
if (B == 5) five++;
if (C == 5) five++;
if (A == 7) seven++;
if (B == 7) seven++;
if (C == 7) seven++;
if (five == 2 && seven == 1)
cout << "YES";
else
cout << "NO";
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Cách tiếp cận này kiểm tra điều kiện trực tiếp bằng cách đếm số lượng các số 5 và số 7 xuất hiện trong input. Ta khởi tạo hai biến đếm 'five' và 'seven'. Sau đó, với mỗi số A, B, C, ta kiểm tra nó có bằng 5 hay 7 không và cập nhật biến đếm tương ứng. Cuối cùng, nếu 'five' bằng 2 và 'seven' bằng 1, đáp án là YES, ngược lại là NO. Phương pháp này rất trực quan và dễ hiểu.
Cách Kiểm tra Logic Ngắn gọn
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define all(a) a.begin(), a.end()
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
int a, b, c; cin >> a >> b>> c;
if (a == 7 && b == 5 && c == 5) cout << "YES";
else if (b == 7 && a == 5 && c == 5) cout << "YES";
else if (c == 7 && a == 5 && b == 5) cout << "YES";
else cout << "NO";
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Phương pháp này liệt kê tất cả các trường hợp hợp lệ. Vì chỉ có 3 số và yêu cầu 2 số 5, 1 số 7, nên chỉ có 3 cách sắp xếp hợp lệ: (7, 5, 5), (5, 7, 5), và (5, 5, 7). Code kiểm tra trực tiếp từng trường hợp này bằng các câu lệnh if-else. Cách này hiệu quả và nhanh chóng cho bài toán quy mô nhỏ này.
Cách Sắp xếp và So sánh
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a[3];
cin >> a[0] >> a[1] >> a[2];
sort(a, a + 3);
int target[3] = {5, 5, 7};
bool ok = true;
for (int i = 0; i < 3; i++) {
if (a[i] != target[i]) {
ok = false;
break;
}
}
cout << (ok ? "YES" : "NO");
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Phương pháp này sắp xếp mảng ba phần tử A, B, C tăng dần. Sau đó, ta chỉ cần so sánh mảng đã sắp xếp này với mảng mục tiêu {5, 5, 7}. Nếu chúng giống nhau, tức là input chứa đúng hai số 5 và một số 7. Cách này giúp code trở nên gọn gàng, dễ kiểm tra và dễ mở rộng nếu cần xử lý nhiều số hơn.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(1) | O(1) | Đếm số lượng (Counting) |
| 2 | O(1) | O(1) | Kiểm tra Logic Ngắn gọn |
| 3 | O(1) | O(1) | Sắp xếp và So sánh |
Bài học kinh nghiệm
- Bài toán không quan trọng đến thứ tự của các số A, B, C, mà chỉ quan tâm đến tập hợp các giá trị này.
- Điều kiện để tạo thành Haiku là tập hợp {A, B, C} phải bằng tập hợp {5, 5, 7}.
Lỗi thường gặp
- Nhầm lẫn giữa việc kiểm tra thứ tự cụ thể (ví dụ: A=5, B=7, C=5) thay vì kiểm tra sự xuất hiện của các giá trị.
- Quên kiểm tra số lượng (ví dụ: chỉ kiểm tra có chứa 5 và 7 mà không quan tâm đến việc phải có đúng hai số 5).
Bình luận