# Chuyên Vĩnh Long 2024 - 2025 ## Bài 1: Diện tích ### Tóm tắt: Cho hình chữ nhật có kích thức m x n, nếu giảm mỗi chiều đi 1 nửa thì diện tích là bao nhiêu ### Ý tưởng Ta chỉ cần chia đôi mỗi phần và tính diện tích với công thức ```S = m * n``` Lưu ý cần lấy 2 chữ số sau phần thập phân ```cpp cout << setprecision(2) << fixed; ``` Code tham khảo: https://www.ideone.com/g2TQrB ## Bài 2: Thi robot ### Tóm tắt: Trong 1 cuộc thi, cho robot là số x là điểm của robot trong cuộc thi đó và các quy tắc sau: * x >= 100 robot sẽ được thưởng 2000000 * 50 >= x < 100 robot sẽ được thưởng 1000000 * x < 50 robot sẽ được thưởng GCN (Giấy chứng nhận) *Yêu cầu*: Với số điểm x (x là số thực) robot sẽ nhận được phần thưởng gì ### Ý tưởng: Bài này chỉ cần if else đơn giản Code tham khảo: https://www.ideone.com/GWAEGT ## Bài 3: Tính tổng ### Tóm tắt: Cho 2 số nguyên m, n. Tính tổng các số chia hết cho 4 và 5 trong [m, n] ### Ý tưởng Bài này giới hạn chỉ có 10^4 nên chỉ cần 1 for duyệt từ m đến n Code tham khảo: https://www.ideone.com/6Joeq9 ## Bài 4: Biến đổi: ### Tóm tắt: Cho mảng a gồm n số nguyên và số nguyên k Với k là số lần biến đổi mảng với mỗi lần biến đổi, tất cả phần tử của a sẽ đảo ngược các chữ số VD: 2009 -> 9002 *Yêu cầu*: * Hỏi sau k lần biến đổi có bao nhiêu số nguyên tố trong mảng * Hỏi sau k lần biến đổi thì số lượng phần tử liên tiếp dài nhât là ước của 2024 là bao nhiêu ### Ý tưởng: Ta có thể dễ dàng nhận thấy là nếu **k** là số **chắn** thì sau k lần biến đổi thì mảng a vẫn **như vậy**, ngược lại k là số **lẻ** thì chỉ cần biến đổi **1 lần**. *nhưng thật ra nếu bạn đủ rảnh thì có thể duyệt k lần mảng a để tính =)) lúc này độ phức tạp sẽ là O(k * n * 4) do a[i] <= 1000 nên trường hợp xấu nhất ta sẽ duyệt 4 lần để đổi chỗ a[i].* Với truy vấn đầu tiên: Có thể sử dụng các kiểm tra số nguyên tố với độ phức tạp O(sqrt(x)) (với x là số cần xét) ```cpp bool check(int x) { for(int i = 2; i * i <= x; i++) if(x % i == 0) return false; return x > 1; } ``` Hoặc nếu bạn vip pro thì có thể dùng sàng số nguyên tố: ```cpp void sieve() { memset(isprime, true, sizeof isprime); isprime[0] = false; isprime[1] = false; for (int i = 1; i * i <= N; i++) if (isprime[i]) for (int j = i * i; j <= N; j += i) isprime[j] = false; } ``` Nhưng tính chất của bài này nên chỉ cần dùng cách 1 là đủ rồi :v Với truy vấn 2 thì chỉ cần đặt 2 for để kiểm tra: ```cpp int Max = 0; for (int i = 1; i <= n; i++) { int dem = 0; for (int j = i; j <= n; j++) { if (2024 % a[j] == 0) dem++; else { Max = max(Max, dem); break; } } } ``` Code tham khảo: https://www.ideone.com/SXd34Z ## Bài 5: Thống kê ### Tóm tắt: Cho xâu s hỏi số lượng chữ số thường của xâu s và số lần xuất hiện của từng chữ cái (cả hoa cả thường) trong s theo thứ tự (nêu gặp phải chữ cái đã in ra thì không in ra nữa). ### Ý tưởng: Chỉ cần sử dụng mảng đếm là có thể giải quyết được bài này *Lưu ý*: input là xâu có thể có dạng "aa bbb cccc" nên cần dùng: ```cpp getline(cin, s); cin.ignore(); ``` nếu chỉ sử dụng ```cin >>``` thì sẽ bỏ qua các kí tự sau dấu cách gây nên sai cả bài. ```cpp int ans = 0; string res = ""; for (auto it : s) { if (it >= 'a' && it <= 'z' || it >= 'A' && it <= 'Z') ans++; if (it >= 'a' && it <= 'z') { cnt[it]++; if (cnt[it] == 1) res += it; } } ``` Vì bài toán yêu cầu tính số lượng cả chữ in hoa lẫn thường nên ta sẽ xét 2 điều kiện để tăng biến ```ans``` Và sử dụng mảng ```cnt``` để đếm số lượng chữ cái tại ```it``` nếu là lần đầu đếm thì sẽ thêm vào xâu res Sau cùng chỉ cần in ra kết quả ```cpp cout << ans << endl; for (auto it : res) cout << it << " - " << cnt[it] << endl; ``` Code tham khảo: https://www.ideone.com/Z8NQ8c