Lời Giải HSG Tin Tỉnh Quảng Ninh (B) - 2010
Bài 1. Tần số
Cho xâu chỉ gồm toàn chữ cái tiếng Anh bao gồm chữ thường và chữ in hoa. Hãy viết chương trình cho biết có bao nhiêu chữ cái khác nhau (chữ thường và chữ in hoa coi là như nhau) có mặt trong xâu , số lần xuất hiện (tần số) của từng chữ cái và chữ cái có mặt nhiều nhất.
Dữ liệu
Vào từ file tan_so.inp gồm một dòng chứa xâu (không quá chữ cái).
Kết quả
Ghi ra file tan_so.out gồm một dòng ghi lần lượt:
- Số lượng chữ cái khác nhau.
- Từng chữ cái cùng tần số của nó (ghi theo thứ tự bảng chữ cái).
- Chữ cái có tần số lớn nhất (nếu có nhiều chữ cái như vậy thì ghi ra chữ cái đứng trước bảng mã ASCII).
Ví dụ
| tan_so.inp | tan_so.out |
|---|---|
| BvsbvabjbvJVaVB | 5A2B5J2S1V5B |
Lời giải
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define nl '\n'
int main()
{
string s; cin >> s;
int a[121] = {0};
int cnt=0, mx=0;
char c;
for (auto i : s){
if ('a' <= i && i <= 'z') i -= 32;
if (a[i]==0) cnt++;
a[i]++;
}
cout << cnt;
for (int i=0;i<121;i++){
if (a[i]!=0){
cout << (char)i << a[i];
if (a[i] > mx){
mx = a[i];
c = (char)i;
}
}
}
cout << c;
return 0;
}Bài 2. Sát sau
Cho một số tự nhiên gồm chữ số .
Ví dụ với số :
Nếu hoán vị chữ số của ta được số như sau:
Sau đó sắp xếp số này theo thứ tự từ điển (tăng dần) ta được:
Lúc này số đứng ngay sau số đã cho trong kết quả sắp xếp này gọi là số sát sau của số đã cho. Cho số , hãy tìm số sát sau của số .
Dữ liệu
Vào từ file SATSAU.INP có cấu trúc:
- Gồm một dòng chứa số nguyên .
Kết quả
Ghi ra file SATSAU.OUT như sau:
- Nếu có nghiệm thì ghi số sát sau của số .
- Nêu vô nghiệm thì ghi chữ số .
Ví dụ
| SATSAU.INP | SATSAU.OUT |
|---|---|
| 5264 | 5426 |
| 654321 | 0 |
Lời giải
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define nl '\n'
int main()
{
string s;
cin >> s;
char min_d = CHAR_MAX;
int n = s.size(), a = n, b;
for (int i = n - 1; i > 0; i--)
{
if (s[i - 1] < s[i])
{
a = i - 1;
break;
}
}
if (a == n)
{
cout << 0;
return 0;
}
for (int i = n - 1; i > a; i--)
{
if (s[i] > s[a] && s[i] < min_d)
{
min_d = s[i];
b = i;
}
}
swap(s[a], s[b]);
sort(s.begin() + a + 1, s.end());
cout << s;
return 0;Bài 3. Trồng cây
Một lớp học được giao nhiệm vụ trồng cây trên một đám đất hình tam giác. Yêu cầu tại mỗi điểm nằm trong tam giác (không kề biên) mà có toạ độ là những số nguyên thì trồng một cây. Hãy viết chương trình tính số cây mà lớp đó phải trồng.
Ví dụ: Cho toạ độ đỉnh của tam giác là: .

Số cây phải trồng là .
Dữ liệu
Dữ liệu vào tròn file Trcay.inp gồm 6 số nguyên trên một dòng ngăn cách bởi dấu cách, tương ứng là toạ độ đỉnh của tam giác tạo nên đám đất phải trồng cây (Toạ độ ba đỉnh của tam giác là các số nguyên thuộc đoạn ).
Kết quả
Dữ liệu ra trong file Trcay.out gồm một số nguyên là số cây phải trồng.
Ví dụ
| Trcay.inp | Trcay.out |
|---|---|
| 2 1 1 6 -5 2 | 16 |
Lời giải
Giả sử ta có tam giác , và điểm .
nằm trong tam giác nếu: .
Nếu nằm trên 1 trong 3 cạnh thì điều trên cũng thoả mãn, tuy nhiên diện tích tam giác tạo bởi và 2 đỉnh của cạnh nó nằm trên sẽ có diện tích là , có nghĩa là: .
Độ phức tạp: .
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define nl '\n'
double area(int a1, int a2, int b1, int b2, int m1, int m2)
{
int n1 = b2 - a2, n2 = a1 - b1;
return abs((double)(n1 * (m1 - a1) + n2 * (m2 - a2)) * 0.5);
}
int main()
{
int a[7];
int min_x, max_x, min_y, max_y, ans = 0;
min_x = min_y = 300;
max_x = max_y = -300;
for (int i = 1; i <= 6; i++)
{
cin >> a[i];
if (i % 2 != 0)
{
min_x = min(min_x, a[i]);
max_x = max(max_x, a[i]);
}
else
{
min_y = min(min_y, a[i]);
max_y = max(max_y, a[i]);
}
}
double total_area = area(a[1], a[2], a[3], a[4], a[5], a[6]);
for (int x = min_x; x <= max_x; x++)
{
for (int y = min_y; y <= max_y; y++)
{
double area1 = area(a[1], a[2], a[3], a[4], x, y);
double area2 = area(a[5], a[6], a[3], a[4], x, y);
double area3 = area(a[1], a[2], a[5], a[6], x, y);
double sum = area1 + area2 + area3, eps = 1e-5;
if (area1 * area2 * area3 == 0)
continue;
if (abs(sum - total_area) <= eps)
ans++;
}
}
cout << ans;
return 0;
}