---
# System prepended metadata

title: Chuyên Vĩnh Long 2024 - 2025

---

# 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    
