https://meet.jit.si/DungTanKhoa
codelearn.io
HỌC SINH HAM CHƠI (TRUNG BINH CONG LON NHAT)
Tóm tắt đề bài
Cho một dãy số gồm \(N\) số nguyên dương (\(1 \le N \le 10^5\))[cite: 17].
- Tìm một dãy con liên tiếp sao cho trung bình cộng các phần tử là lớn nhất[cite: 17].
- In ra kết quả trung bình cộng lớn nhất đó[cite: 17].
Hướng giải quyết đơn giản nhất (Nhận xét toán học)
- Giả sử giá trị lớn nhất trong toàn bộ dãy số là \(M\).
- Nếu ta chọn một dãy con chỉ gồm đúng 1 phần tử duy nhất có giá trị \(M\), thì trung bình cộng của đoạn con này chính bằng \(M\).
- Nếu ta ghép thêm bất kỳ phần tử nào khác nhỏ hơn \(M\) vào đoạn con, trung bình cộng chắc chắn sẽ bị kéo giảm xuống (\(< M\)).
- Do đó, trung bình cộng lớn nhất của một đoạn con luôn luôn bằng chính phần tử lớn nhất trong dãy (\(M\)).
- Bài toán đơn giản chỉ là: duyệt qua dãy và tìm giá trị lớn nhất[cite: 17].
Điền vào chỗ trống
C++
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
... >> n;
long long max_val = 0;
for (int i = 0; i < n; i++) {
long long x;
cin >> x;
max_val = max(max_val, ...);
}
cout << ... << "\n";
return 0;
}
YUGIOH (THAM LAM CO BAN)
Tóm tắt đề bài
Yugi có \(n\) lá bài[cite: 14]. Lá thứ \(i\) có sức mạnh \(A_i\)[cite: 14]:
- Nếu \(A_i \ge 0\): Yugi được cộng \(A_i\) máu[cite: 14].
- Nếu \(A_i < 0\): Kaiba bị trừ \(\vert{}A_i\vert{}\) máu[cite: 14].
- Yugi muốn trừ máu Kaiba nhiều nhất có thể khi được dùng tối đa \(m\) lá bài[cite: 14].
- In ra số máu tối đa Kaiba bị trừ[cite: 14].
Hướng giải quyết đơn giản nhất
- Chỉ những lá bài có giá trị âm (\(A_i < 0\)) mới trừ máu của Kaiba[cite: 14].
- Muốn trừ máu Kaiba nhiều nhất, ta cần chọn những lá có giá trị âm nhỏ nhất (tức là \(\vert{}A_i\vert{}\) lớn nhất)[cite: 14].
- Các bước làm:
- Sắp xếp dãy số \(A\) tăng dần bằng
sort(a, a + n). - Dùng vòng lặp duyệt tối đa \(m\) lá bài đầu tiên: nếu lá nào có giá trị âm (\(a[i] < 0\)), ta cộng dồn \(\vert{}a[i]\vert{} = -a[i]\) vào kết quả[cite: 14].
- Dừng lại nếu gặp số không âm (\(a[i] \ge 0\)) hoặc đã chọn đủ \(m\) lá bài[cite: 14].
- Sắp xếp dãy số \(A\) tăng dần bằng
Điền vào chỗ trống
C++
#include <iostream>
#include <algorithm>
using namespace std;
int a[10005];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
... >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[...];
}
// Sắp xếp mảng tăng dần để các số âm nhỏ nhất lên đầu
sort(a, a + ...);
long long ans = 0;
// Chọn tối đa m lá bài
for (int i = 0; i < m; i++) {
if (a[i] < 0) {
ans += -a[...];
} else {
...; // Gặp số không âm thì dừng vì không trừ máu Kaiba
}
}
cout << ... << "\n";
return 0;
}
GÀU NƯỚC (CÔNG THỨC 1 DÒNG TOÁN HỌC)
Tóm tắt đề bài
Có \(L\) lít nước (\(1 \le L \le 10^{18}\)), có vô hạn gàu loại \(5\) lít và \(2\) lít[cite: 15].
- Tìm tổng số gàu ít nhất để đong được ít nhất \(L\) lít nước[cite: 15].
Hướng giải quyết bằng mẹo
- Vì chỉ cần đong ít nhất \(L\) lít (được phép dư), dùng gàu \(5\) lít luôn luôn có lợi hơn gàu \(2\) lít[cite: 15].
- Ta chỉ cần dùng toàn bộ gàu \(5\) lít[cite: 15].
- Số gàu cần dùng là phép chia làm tròn lên: \((L + 4) / 5\)[cite: 15].
Điền vào chỗ trống
C++
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long L;
... >> L;
// Làm tròn lên của phép chia L cho 5
long long ans = (L + ...) / ...;
cout << ... << "\n";
return 0;
}
MUA XĂNG (CHI PHI TOI THIEU)
Tóm tắt đề bài
Cần mua đúng chính xác \(N\) lít xăng (\(1 \le N \le 10^9\))[cite: 16]:
- Mua bình 1L tốn giá \(a\) đồng[cite: 16].
- Mua bình 2L tốn giá \(b\) đồng[cite: 16].
- Tìm chi phí ít nhất để mua đúng \(N\) lít[cite: 16].
Hướng giải quyết đơn giản nhất
- Giá của 2 lít xăng khi mua lẻ từng bình 1L là \(2 \times a\) đồng[cite: 16].
- So sánh giữa việc mua 1 bình 2L (\(b\) đồng) và mua 2 bình 1L (\(2 \times a\) đồng)[cite: 16]:
- Trường hợp 1 (\(2 \times a \le b\)): Mua bình 1L luôn rẻ hơn hoặc bằng \(\rightarrow\) toàn bộ \(N\) lít đều mua bằng bình 1L với chi phí \(N \times a\)[cite: 16].
- Trường hợp 2 (\(2 \times a > b\)): Mua bình 2L rẻ hơn \(\rightarrow\) ưu tiên mua tối đa các bình 2L:
- Mua \((N / 2)\) bình loại 2L với giá \((N / 2) \times b\)[cite: 16].
- Nếu \(N\) lẻ (\(N \% 2 == 1\)), mua thêm \(1\) bình 1L với giá \(a\)[cite: 16].
- Dùng kiểu dữ liệu
long longđể tránh tràn số vì \(N, a, b \le 10^9\)[cite: 16].
Điền vào chỗ trống
C++
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long n, a, b;
... >> n >> a >> b;
long long ans = 0;
if (2 * a <= b) {
// Mua toàn bộ bằng bình 1 lít
ans = n * ...;
} else {
// Ưu tiên mua bình 2 lít
ans = (n / 2) * ... + (n % 2) * ...;
}
cout << ... << "\n";
return 0;
}
26_CBE1: C++ Cơ bản
Bình luận