C++の練習を兼ねて, AtCoder Beginner Contest 107 の 問題C(Candles)を解いてみた.
■感想.
時間内に解答出来なかったので, 解説見て解き直ししたところ, “連続する K 本のろうそくに火を付けるのが最適” との記述があり,
なるほどと感心してしまった.
※そのような発想が出てこなかった(汗), とはいえ, 非常に勉強になったので良かったと思う.
本家のサイトABC #107 / ARC #101 Editorialをご覧下さい。
■C++版プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// 解き直し. // ABC #107 / ARC #101 Editorial // https://img.atcoder.jp/arc101/editorial.pdf #include <iostream> using namespace std; #define FOR(i, a, b) for(int i=(a); i<(b); ++i) #define abs(x) ((x > 0) ? x : (-(x))) #define min(x, y) ((x > y) ? y : x) typedef long long LL; int main() { // 1. 入力情報取得. int N, K; cin >> N >> K; LL X[N] = {}; FOR(i, 0, N) cin >> X[i]; // 2. 連続する K 本のろうそくに火を付けるのが最適(解説通り). LL mDistance = 10000000000000; FOR(l, 0, N - K + 1) { // 最も左の蝋燭(index) … l, 最も右の蝋燭(index) … r. int r = l + K - 1; LL distance = min(abs(X[l]) + abs(X[r] - X[l]), abs(X[r]) + abs(X[r] - X[l])); if(distance < mDistance) mDistance = distance; } // 3. 出力 ~ 後処理. cout << mDistance << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 107