Thông tin
Sau đây là lời giải của Kỳ thi Tuyển sinh 10 trường THPT chuyên Lê Quý Đôn tỉnh Bà Rịa - Vũng Tàu năm học 2015 - 2016.
Bạn đọc có thể nộp và chấm bài (test tự sinh) TẠI ĐÂY.
Chuẩn bị bởi team Logica, thuộc khuôn khổ dự án The Algitect (ALGI Project)
Cho số nguyên dương
Khởi gán
Độ phức tạp thời gian:
Khởi gán
Độ phức tạp thời gian:
Gọi
Khởi gán
Duyệt qua mọi
Độ phức tạp thời gian:
Lưu ý: Vì bài toán liên quan tới số thực. Vậy nên cần sử dụng kiểu dữ liệu double hoặc long double để đảm bảo độ chính xác.
Độ phức tạp thời gian của cả bài toán là tổng độ phức tạp thời gian của từng yêu cầu.
#include<bits/stdc++.h>
using namespace std;
int n;
long double A = 0, B = 1, C = 0, v = 1;
int main() {
cin >> n;
for (int i = 3; i <= n; i++) {
A += (long double)1 / i;
}
for (int i = 3; i <= n; i++) {
B *= (long double)(i - 2) / (i - 1) - sqrtl(i);
}
for (int i = 1; i <= 2*n+1; i++) {
v *= (long double)2 / i;
if (i & 1) {
C += v;
}
else {
C -= v;
}
}
cout << fixed << setprecision(4) << A << '\n' << B << '\n' << C;
return 0;
}
Cho 3 số nguyên dương
Tip
Bội chung nhỏ nhất của
Sử dụng hàm gcd()
có sẵn trong thư viện STL của C++, dễ dàng tính được đáp án.
Độ phức tạp thời gian:
Đây là độ phức tạp của thuật toán Euclid để tính UCLN.
Nhận xét
Nếu một số nguyên dương
Chứng minh
Bài toán quy về kiểm tra một số có phải số chính phương hay không.
Ta có thể kiểm tra một số
Độ phức tạp thời gian:
Đây là độ phức tạp của hàm
sqrt()
trong C++ STL.
Độ phức tạp thời gian của cả bài toán là tổng độ phức tạp thời gian của từng yêu cầu.
#include <bits/stdc++.h>
using namespace std;
long long a, b, n;
long long lcm(long long a, long long b) {
return a * b / __gcd(a, b);
}
bool sqr(long long x) {
long long t = sqrt(x);
return t * t == n;
}
int main() {
cin >> a >> b >> n;
cout << lcm(a, b) << '\n' << sqr(n);
return 0;
}
Cho dãy số nguyên gồm
Duyệt qua mọi
Độ phức tạp thời gian:
Gọi
Độ phức tạp thời gian:
Sử dụng thuật toán kiểm tra số nguyên tố trong căn bậc 2 hoặc sàng nguyên tố Eratosthenes để giải bài toán.
Độ phức tạp thời gian:
Áp dụng quy hoạch động cơ bản.
Gọi
Đáp án:
Độ phức tạp thời gian:
Gọi
Duyệt qua mọi
Sau đó duyệt qua mọi giá trị
Độ phức tạp thời gian:
Độ phức tạp thời gian của cả bài toán là tổng độ phức tạp thời gian của từng yêu cầu.
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
vector<int> a;
vector<bool> f, mark;
cin >> n;
a.resize(n);
f.resize(n+5,true);
mark.resize(n+5,false);
for (auto &x : a) {
cin >> x;
}
for (auto &x : a) {
if (x > 0 && !(x & 1)) {
cout << x << ' ';
}
}
cout << '\n' << *min_element(a.begin(),a.end()) << '\n';
f[0] = f[1] = 0;
for (int i = 1, t = sqrt(n); i <= t; i++) {
if (f[i]) {
for (int j = i * i; j <= n; j += i) {
f[j] = 0;
}
}
}
bool ans = 1;
for (auto &x : a) {
if (x < 0 || !f[x]) {
ans = 0;
break;
}
}
cout << (ans ? "YES" : "NO") << '\n';
int max_len = 0, cur_len = 0;
for (auto &x : a) {
if (x >= 0) {
if (cur_len > max_len) max_len = cur_len;
cur_len = 0;
}
else {
cur_len++;
}
}
if (cur_len > max_len) {
max_len = cur_len;
}
cout << max_len << '\n';
for (auto &x : a) {
if (!mark[x] && x > 0) {
mark[x] = 1;
}
}
for (int i = 1; i <= n + 1; i++) {
if (!mark[i]) {
cout << i;
break;
}
}
}
Cho
Đây là một bài toán sweep line cơ bản.
Nhận xét
Chỉ điểm đầu và điểm cuối của mỗi đoạn sẽ ảnh hưởng tới số lượng đoạn thẳng giao nhau tại một điểm.
Gọi
Biểu thị khi đến điểm
, đoạn thẳng thứ bắt đầu xuất hiện, còn khi đến thì đoạn thẳng thứ kết thúc.
Sau đó duyệt qua mọi điểm
Tại bất cứ thời điểm nào,
Đáp án là
Độ phức tạp thời gian:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
vector<array<int,2>> event;
cin >> n;
for (int i = 1; i <= n; i++) {
int a, b;
cin >> a >> b;
event.push_back({a, 1});
event.push_back({b+1, -1});
}
sort(event.begin(),event.end());
int virus = 0, max_virus = 0;
for (auto &e : event) {
virus += e[1];
max_virus = max(max_virus, virus);
}
cout << max_virus;
return 0;
}