Bài Toán A: Xác Định Giá Trị Độc Nhất
Yêu cầu tìm giá trị xuất hiện duy nhất trong ba số nguyên. Thuật toán sử dụng phép XOR để xác định phần tử khác biệt:
#include <iostream>
using namespace std;
int giaiQuyetTruongHop() {
int x, y, z;
cin >> x >> y >> z;
return x ^ y ^ z; // Phép XOR loại bỏ giá trị lặp
}
int main() {
int soLuongTest;
cin >> soLuongTest;
while (soLuongTest--) {
cout << giaiQuyetTruongHop() << '\n';
}
return 0;
}
Bài Toán B: Điền Ký Tự Thiếu Trong Ma Trận
Cho ma trận 3x3 với một vị trí chứa '?', cần điền 'A', 'B' hoặc 'C' còn thiếu trên hàng tương ứng:
#include <iostream>
#include <set>
using namespace std;
char xacDinhKyTuThieu(char hang[]) {
set<char> tapKyTu = {'A', 'B', 'C'};
for (int i = 0; i < 3; ++i) {
tapKyTu.erase(hang[i]);
}
return *tapKyTu.begin();
}
int main() {
int soTest;
cin >> soTest;
while (soTest--) {
char maTran[3][3];
int viTriDauHoi;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
cin >> maTran[i][j];
if (maTran[i][j] == '?') viTriDauHoi = i;
}
}
cout << xacDinhKyTuThieu(maTran[viTriDauHoi]) << '\n';
}
return 0;
}
Bài Toán C: Kiểm Tra Tổng Dãy Số Là Số Chính Phương
Tính tổng dãy số và kiểm tra tính chính phương bằng cách so sánh căn bậc hai nguyên:
#include <iostream>
#include <cmath>
using namespace std;
bool laSoChinhPhuong(long long tong) {
long long canBacHai = sqrt(tong);
return canBacHai * canBacHai == tong;
}
int main() {
int soLuongTest;
cin >> soLuongTest;
while (soLuongTest--) {
int n;
cin >> n;
long long tongDaySo = 0;
for (int i = 0; i < n; ++i) {
long long giaTri;
cin >> giaTri;
tongDaySo += giaTri;
}
cout << (laSoChinhPhuong(tongDaySo) ? "Yes" : "No") << '\n';
}
return 0;
}
Bài Toán D: Phân Đoạn Từ Theo Quy Tắc Nguyên Âm/Phụ Âm
Xử lý chuỗi từ phải sang trái để phân tách thành các âm tiết CVC hoặc CV:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool laNguyenAm(char kyTu) {
return (kyTu == 'a' || kyTu == 'e');
}
bool laPhuAm(char kyTu) {
return (kyTu == 'b' || kyTu == 'c' || kyTu == 'd');
}
int main() {
int soTest;
cin >> soTest;
while (soTest--) {
int doDai;
cin >> doDai;
string chuoi;
cin >> chuoi;
vector<char> ketQua;
for (int i = doDai - 1; i >= 0; --i) {
ketQua.push_back(chuoi[i]);
if (i >= 2 && laPhuAm(chuoi[i]) && laNguyenAm(chuoi[i-1]) && laPhuAm(chuoi[i-2])) {
ketQua.push_back(chuoi[i-1]);
ketQua.push_back(chuoi[i-2]);
ketQua.push_back('.');
i -= 2;
}
else if (i > 0 && laNguyenAm(chuoi[i]) && laPhuAm(chuoi[i-1])) {
ketQua.push_back(chuoi[i-1]);
ketQua.push_back('.');
i--;
}
}
for (int i = ketQua.size() - 2; i >= 0; --i) {
cout << ketQua[i];
}
cout << '\n';
}
return 0;
}
Bài Toán E: Kiểm Tra Dãy Con Có Tổng Chẵn/Lẻ Bằng Nhau
Sử dụng tiền tố để theo dõi hiệu giữa tổng chỉ số lẻ và chẵn. Nếu hiệu xuất hiện hai lần hoặc bằng 0, dãy con tồn tại:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int soTest;
cin >> soTest;
while (soTest--) {
int n;
cin >> n;
vector<int> daySo(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> daySo[i];
}
long long hieu = 0;
unordered_map<long long, bool> daXuatHien;
bool coDanhDau = false;
for (int i = 1; i <= n; ++i) {
hieu += (i % 2 == 1) ? daySo[i] : -daySo[i];
if (hieu == 0 || daXuatHien[hieu]) {
cout << "yes\n";
coDanhDau = true;
break;
}
daXuatHien[hieu] = true;
}
if (!coDanhDau) {
cout << "NO\n";
}
}
return 0;
}