# 25thtb18 - THT C2 Đà Nẵng 2022 ## Thập phân *Đề gây lú: Nhầm lẫn: Luôn làm tròn xuống* Làm tròn tới **số gần nhất**. Nếu có nhiều số gần nhất, chọn số nhỏ hơn. Trường hợp: `a.5` --> làm tròn xuống $a$ Python ```python x = float(input()) le = x - int(x) if le <= 0.5: print(int(x)) else: print(int(x) + 1) ``` C++ ```cpp #include<bits/stdc++.h> using namespace std; int main() { float x; cin >> x; float le = x - int(x); if (le <= 0.5) cout << int(x); else cout << int(x) + 1; } ``` ## Robot > Cũng là robot ### Sub 1: 50% - Mô phỏng ### Sub 2: Một 'R' sẽ triệt tiêu một 'L' (và ngược lại) Chỉ cần quan tâm số lượng phép biến đổi. Thuật toán: 1. Coi R = 1, L = -1 1. Tính d = tổng của xâu lệnh a 1. d = d chia lấy dư cho n 1. Biến đổi dựa trên d VD : S = abcde, a = 'LL' --> cde + ab tương đương 'RRR' qua trái i lần == qua phải n - i lần **Bug Quý (C++)** **biến int chia lấy dư cho s.size()** Khi lấy biến `int` chia lấy dư (hoặc cộng trừ) cho biến `unsigned int`, kết quả sẽ bị ảnh hưởng theo modulo $2^k$ ## BỘ BA SỐ ### Sub 1: Chạy 3 for để lấy 3 vị trí ### Sub 2: Chạy for phần tử ở giữa (a[j]). Nhận thấy: $$3a_i + 2a_j - 5a_k$$ 3 > 0 Chọn $a_i$ là phần tử MAX trước pt giữa a[j] -5 < 0 Chọn $a_k$ là phần tử MIN sau pt giữa a[j] Dùng vòng lặp For để tính ### Sub 3: Dùng mảng Prefix-Sum (sửa lại để tính Min / Max) `S[i] = S[i-1] + a[i]` `S[i] = max(S[i-1], a[i])` Suffix: `S[i] = max(S[i+1], a[i])` ## Độ vui vẻ ### Sub 1: ``` for (lượt từ 1 tới k) { 1. Tìm vị trí phần tử lớn nhất a[i_max]: i_max = 1 for (i từ 2 tới n) { nếu a[i] > a[i_max] thì i_max = i } 2. Tổng = tổng + a[i_max] 3. a[i_max] -= 1 } ``` ### Sub 2: ``` for (lượt từ 1 tới k) { 1. Tìm vị trí phần tử lớn nhất a[i_max] 2. Tổng = tổng + a[i_max] 3. a[i_max] -= 1 } ``` C++ `priority_queue`: heap Bước 1. tốn độ phức tạp $O(\log (n))$ Python: https://docs.python.org/3/library/heapq.html 1 3 3 4 8 9 12 1 3 3 4 8 9 9 k = 11 11 / 3 = 3 1 3 3 4 8 8 8 1 3 3 4 5 5 5 k -= 3*3 k = 2 ### Sub 3 ![image](https://hackmd.io/_uploads/BJPkXQSyxe.png)