Hướng dẫn giải của IF14: Cấp số cộng
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng dẫn giải
Ba số cho trước là ba trong bốn số của một cấp số cộng, nhưng không theo đúng thứ tự. Cần tìm số còn thiếu. Nếu có nhiều đáp án thì in số lớn nhất.
Cách làm
- Đọc ba số và sắp xếp tăng dần thành p, q, r.
- Số thiếu có thể nằm ở bốn vị trí. Nếu q - p bằng r - q thì số thiếu có thể là r + (r - q) (ở cuối) hoặc p - (q - p) (ở đầu).
- Nếu r - q bằng 2 nhân (q - p) thì số thiếu nằm giữa q và r, bằng q + (q - p).
- Nếu q - p bằng 2 nhân (r - q) thì số thiếu nằm giữa p và q, bằng p + (r - q).
- Trong các đáp án hợp lệ, lấy số lớn nhất bằng hàm max. Cuối cùng in số đó. Bẫy: không cần thử mọi số vì giá trị có thể lớn, chỉ cần xét bốn trường hợp trên.
#include <bits/stdc++.h>
using namespace std;
int main() {
long long x, y, z;
cin >> x >> y >> z;
// Sắp xếp ba số tăng dần: p <= q <= r
long long p = x, q = y, r = z;
if (p > q) {
long long t = p;
p = q;
q = t;
}
if (q > r) {
long long t = q;
q = r;
r = t;
}
if (p > q) {
long long t = p;
p = q;
q = t;
}
// Xét 4 vị trí của số bị thiếu trong cấp số cộng, mỗi trường hợp tính một số có thể là đáp án
// Số lớn nhất trong các đáp án hợp lệ sẽ được in ra
long long best = LLONG_MIN;
if (q - p == r - q) {
// Số thiếu nằm ở đầu hoặc cuối dãy
best = max(best, r + (r - q));
best = max(best, p - (q - p));
}
if (r - q == 2 * (q - p)) {
// Số thiếu nằm giữa q và r
best = max(best, q + (q - p));
}
if (q - p == 2 * (r - q)) {
// Số thiếu nằm giữa p và q
best = max(best, p + (r - q));
}
cout << best << "\n";
return 0;
}
Bình luận