# 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