Bài toán A: Chân Động Vật
Nội dung bài toán: Với một số chẵn, xác định số lượng đầu tối thiểu của động vật trên trang trại (chỉ có bò và gà).
Giải pháp: Xác định số lượng bò tối đa trước, sau đó là số lượng gà tối đa.
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
while(t--) {
long long n;
cin >> n;
if(n % 4 == 0) {
cout << n / 4 << endl;
} else {
int k = n / 4;
n -= k * 4;
k += n / 2;
cout << k << endl;
}
}
return 0;
}
Bài toán B: Thu Nhỏ Ma Trận
Nội dung bài toán: Cho ma trận kích thước n×n, thu nhỏ nó theo hệ số k.
Giải pháp: In ra phần tử tại vị trí [i+k][j+k].
#include<iostream>
#include<vector>
using namespace std;
const int MAX = 1005;
int main() {
int t;
cin >> t;
while(t--) {
int n, k;
cin >> n >> k;
vector<string> grid(n);
for(int i = 0; i < n; ++i) {
cin >> grid[i];
}
for(int i = 0; i < n; i += k) {
for(int j = 0; j < n; j += k) {
cout << grid[i][j];
}
cout << endl;
}
}
return 0;
}
Bài toán C: Sắp Xếp Chuỗi
Nội dung bài toán: Cho hai chuỗi, tính số ký tự cần thay đổi để hai chuỗi giống nhau sau khi sắp xếp từ chỉ số l đến r.
Giải pháp: Tính tổng số lượng ký tự ở mỗi vị trí và so sánh.
#include<iostream>
#include<vector>
using namespace std;
const int MAX = 1005;
int main() {
int t;
cin >> t;
while(t--) {
int n, m;
cin >> n >> m;
string s1, s2;
cin >> s1 >> s2;
s1 = ' ' + s1 + ' ';
s2 = ' ' + s2 + ' ';
vector freq1(n+1, vector<int>(27, 0));
vector freq2(n+1, vector<int>(27, 0));
for(int i = 1; i <= n; ++i) {
freq1[i][s1[i] - 'a' + 1]++;
for(int j = 1; j <= 26; ++j) {
freq1[i][j] += freq1[i-1][j];
}
}
for(int i = 1; i <= n; ++i) {
freq2[i][s2[i] - 'a' + 1]++;
for(int j = 1; j <= 26; ++j) {
freq2[i][j] += freq2[i-1][j];
}
}
for(int i = 1; i <= m; ++i) {
int a, b;
cin >> a >> b;
int diff = 0;
for(int j = 1; j <= 26; ++j) {
int cnt1 = freq1[b][j] - freq1[a-1][j];
int cnt2 = freq2[b][j] - freq2[a-1][j];
diff += abs(cnt1 - cnt2);
}
cout << diff / 2 << endl;
}
}
return 0;
}
Bài toán D: Thử Thách
Nội dung bài toán: Cho ba số nguyên a, b, c với điều kiện a*b + a*c + b*c ≤ n và a+b+c ≤ x. Tìm số tổ hợp khác nhau thỏa mãn điều kiện.
Giải pháp: Dùng phương pháp brute-force để kiểm tra tất cả các tổ hợp khả thi.
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
while(t--) {
int n, x;
cin >> n >> x;
long long count = 0;
for(int a = 1; a <= n; ++a) {
for(int b = 1; a * b <= n && a + b <= x; ++b) {
count += min((n - a * b) / (a + b), x - a - b);
}
}
cout << count << endl;
}
return 0;
}