From f7f3efd3f0c2634d741bcbf3b5639c1ba6b8c40f Mon Sep 17 00:00:00 2001 From: Raphael McSinyx Date: Tue, 15 Aug 2017 20:49:11 +0700 Subject: Add 12/QG-2008/seqgame.cpp --- 12/QG-2008/README.md | 36 ++++++++++++++++++++++++++++++ 12/QG-2008/seqgame.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 12/QG-2008/README.md create mode 100644 12/QG-2008/seqgame.cpp diff --git a/12/QG-2008/README.md b/12/QG-2008/README.md new file mode 100644 index 0000000..4327b5d --- /dev/null +++ b/12/QG-2008/README.md @@ -0,0 +1,36 @@ +# KÌ THI CHỌN HỌC SINH GIỎI QUỐC GIA THPT NĂM 2008 + +## Trò chơi với dãy số + +Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây. Mỗi bạn chọn +trước một dãy số gồm n số nguyên. Giả sử dãy số mà bạn thứ nhất chọn là: +b1, b2, …, bn; còn dãy số mà bạn thứ hai chọn +là: c1, c2, …, cn. Mỗi lượt chơi mỗi bạn đưa +ra một số hạng trong dãy số của mình. Nếu bạn thứ nhất đưa ra số hạng +bi (1 ≤ i ≤ n), còn bạn thứ hai đưa ra số hạng cj (1 ≤ j +≤ n) thì giá của lượt chơi đó sẽ là |bi + cj|. + +### Yêu cầu + +Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể. + +### Dữ liệu + +* Dòng đầu tiên chứa số nguyên dương n (n ≤ 10000); +* Dòng thứ hai chứa dãy số nguyên b1, b2, …, + bn (|bi| ≤ 109, i = 1, 2, …, n); +* Dòng thứ ba chứa dãy số nguyên c1, c2, …, + cn (|ci| ≤ 109, i = 1, 2, …, n); +* Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách. + +### Kết quả + +Ghi ra giá nhỏ nhất tìm được. + +### Ví dụ + +| SEQGAME.INP | SEQGAME.OUT | +| ---------------- | :---------: | +| 2
1 -2
2 3 | 0 | + +*60% số tests ứng với 60% số điểm của bài có 1 ≤ n ≤ 1000.* diff --git a/12/QG-2008/seqgame.cpp b/12/QG-2008/seqgame.cpp new file mode 100644 index 0000000..b1751c7 --- /dev/null +++ b/12/QG-2008/seqgame.cpp @@ -0,0 +1,59 @@ +#include +#include +#include + +#define ABS(x) ((x < 0) ? -x : x) + +using namespace std; + +int +main() +{ + ifstream infile; + ofstream outfile; + short n; + long i, c, min = 2e9, a; + set b; + std::set::iterator k; + + infile.open("SEQGAME.INP"); + infile >> n; + for (i = 0; i < n; i++) + { + infile >> c; + b.insert(c); + } + + for (; n--;) + { + infile >> c; + k = b.lower_bound(-c); + if (*k == -c) + { + min = 0; + break; + } + + if (k != b.end()) + { + i = ABS(*k + c); + if (a < min) + min = i; + } + + if (k != b.begin()) + { + k--; + i = ABS(*k + c); + if (a < min) + min = i; + } + } + infile.close(); + + outfile.open("SEQGAME.OUT"); + outfile << min << endl; + outfile.close(); + + return 0; +} -- cgit 1.4.1