Lời Giải HSG Tin Tỉnh Quảng Ninh (B) - 2018
Bài 1. Tổng các số
Yêu cầu
Bạn hãy viết chương trình tính tổng các số nguyên dương nằm trong đoạn và chia hết cho số nguyên dương cho trước.
Dữ liệu
Từ tệp tongso.inp gồm một dòng ghi ba số nguyên dương viết cách nhau.
Kết quả
Ghi vào tệp tongso.out một số nguyên dương là tổng các số nằm trong đoạn và chia hết cho .
Ví dụ
| tongso.inp | tongso.out | Giải thích kết quả |
|---|---|---|
| 1 20 3 | 63 | Trong đoạn [1;20] các số chia hết cho 3 gồm: 3, 6, 9, 12, 15, 18; tổng các số này bằng 63. |
| 15 48 6 | 198 | Trong đoạn [15;48] các số chia hết cho 6 gồm: 18, 24, 30, 36, 42, 48; tổng các số này bằng 198. |
Ràng buộc
- số test ứng với số điểm của bài có .
- số test ứng với số điểm của bài có .
- số test ứng với số điểm của bài có .
Lời giải
Giả sử tổng các số trong đoạn mà chia hết cho là:
Ta thấy là các số chia hết cho kề nhau, vậy sẽ là các số tự nhiên liên tiếp.
Ta áp dụng công thức tổng các số tự nhiên từ :
Độ phức tạp: .
Code
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
#define nl '\n'
int main()
{
ll a, b, k; cin >> a >> b >> k;
a = (a + (a%k!=0)*k)/k;
b /= k;
ll ans = k * (b-a+1) * (a+b) / 2;
cout << ans;
return 0;
}Bài 2. Xâu kí tự
Cho xâu gồm các kí tự là chữ số (từ đến ) viết liền nhau. Ta biến đổi xâu bằng việc chuyển kí tự đầu tiên của nó xuống vị trí cuối cùng, cứ tiếp tục làm như vậy cho đến kí tự cuối cùng.
Ví dụ: nếu thì:
Lần thứ nhất ta được .
Lần thứ hai ta được .
Lần thứ ba ta được .
…
Lần thứ sáu ta được và kết thúc.
Yêu cầu
Hãy viết chương trình cho biết khi kết thúc quá trình biến đổi như trên thì có tất cả bao nhiêu xâu đối xứng được tạo ra.
Xâu được gọi là đối xứng nếu đọc nó từ phải sang trái cũng thu được kết quả giống như đọc từ trái sang phải.
Dữ liệu
Từ tệp demxau.inp gồm một dòng chứa xâu .
Kết quả
Ghi vào tệp demxau.out một số tự nhiên là số xâu đối xứng có được khi biến đổi .
Ví dụ
| demxau.inp | demxau.out | GIải thích kết quả |
|---|---|---|
| 2223355332 | 2 | - đối xứng - không đối xứng - … - đối xứng - … |
Ràng buộc
- Có số test tương ứng với số điểm của bài với xâu có độ dài tối đa kí tự.
- Có số test tương ứng với số điểm của bài với xâu có độ dài tối đa kí tự.
- Có số test tương ứng với số điểm của bài với xâu có độ dài tối đa kí tự.
Lời giải
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define nl '\n'
string s;
bool palindrome(int l, int r){
while (l <= r){
if (s[l] != s[r]) return false;
l++; r--;
}
return true;
}
int main()
{
cin >> s;
int n = s.size(), ans = 0;
for (int i=0;i<n;i++){
if (palindrome(i, i + n - 1)) ans++;
s += s[i];
}
cout << ans;
return 0;
}Bài 3. Số may mắn
Tại một cửa hàng thời trang, nhận dịp ngày Phụ nữ Việt Nam - 20/10, cửa hàng tặng cho mỗi khách hàng một phiếu dự thưởng khi mua hàng.
Khách hàng sau khi có phiếu dự thưởng điền đẩy đủ họ tên và Mã số dự thưởng rồi bỏ vào hòm phiếu dự thưởng.
Mã số dự thưởng là một số nguyên từ đến được khách hàng tuỳ ý lựa chọn. Các phiếu dự thưởng được đánh số từ đến .
Cửa hàng muốn tìm số may mắn để trao thưởng cho khách hàng. Số may mắn là Mã số dự thưởng mà có ít khách hàng lựa chọn nhất.
Yêu cầu
Hãy viết chương trình giúp chủ cửa hàng trên tìm ra số may mắn. Trong trường hợp có nhiều số may mắn thì tìm tất cả các số đó.
Dữ liệu
Từ tệp somayman.inp gồm hai dòng:
- Dòng thứ nhất chứa số nguyên là số phiếu dự phòng.
- Dòng thứ hai chứa số nguyên viết cách nhau. Trong đó, là mã số dự phòng của khách hàng thứ .
Kết quả
Ghi vào tệp somayman.out các số may mắn tìm được, mỗi số viết trên một dòng theo thứ tự từ nhỏ đến lớn.
Ví dụ
| somayman.inp | somayman.out | Giải thích kết quả |
|---|---|---|
| 8 5 17 20 20 5 20 5 20 | 17 | Số 17 xuất hiện đúng một lần. |
| 10 5 10 7 12 12 5 7 10 5 12 | 7 10 | Số 10 và số 7 đều xuất hiện ít nhất (2 lần). |
Ràng buộc
- Có số test ứng với số điểm của bài có và dãy các số không giảm.
- Có số test ứng với số điểm của bài có và dãy các số bất kì.
- Có số test ứng với số điểm của bài có và dãy các số bất kì.
Lời giải
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define nl '\n'
int main()
{
int n; cin >> n;
map<int,int> mp;
for (int i=0;i<n;i++){
int a; cin >> a;
mp[a]++;
}
int freq = n+1;
for (auto i : mp) freq = min(freq, i.second);
for (auto i : mp){
if (i.second == freq) cout << i.first << nl;
}
return 0;
}