SRM608 Div2 (復習)
参加出来なかったので復習.
反省点
- 説明が上手くできない.
- 問題文の理解に時間がかかる・(向いていないかも・・・)
[250 OneDimensionalRobotEasy]
通した.
(問題文)
1次元の数直線上で[-A, B]の範囲をロボットが動く.初期位置は原点0.
コマンドが文字列で与えられる.
i番目の文字はi番目の命令で,'R'ならば右に,'L'ならば左にロボットが移動する.
ただし,-Aの場所で'L'が与えられても-Aにとどまる.
また,Bの場所で'R'が与えれてもBにとどまるとする.
この時,すべての命令によって動いたロボットの最終位置を答える.
(方針)
シミュレーションなので問題分の通りに実装.
[500 MysticAndCandiesEasy]
通した.
問題文を理解するのに時間がかかった.
なんとなくで通してツライ.
(問題文)
N個の中身が見えない箱が与えられていて,C個のキャンディがいづれかの箱に入っている.
i番目の箱には0からhigh[i]個のキャンディが入っている.
最低何個の箱を開ければX個以上のキャンディが得られるかを答える.
(方針)
一般的な説明が上手く出来ないので次の例で示す.
C = 100, X = 63, high = {12, 34, 23, 45, 34}.
highが小さい順にソートする.
higi = {12, 23, 34, 34, 45}
1. ここで,highが12の箱に12個のキャンディが入っていたとしたら,
残りの箱には最低でも100 - 12 = 88個キャンディが入っている.
2. 次に,highが23の箱に23個のキャンディが入っていたとしたら,
残りの箱には最低でも88 - 23 = 65個のキャンディが入っている.
3. 次に,highが34の箱に34個のキャンディが入っていたとしたら,
残りの箱には最低でも65 - 34 = 31個のキャンディが入っていることになる.
欲しいキャンディの個数は最低63(= X)個であるから,3のhighが34の箱は開ける.
よって,開けるのは{34, 34, 45}の3個の箱である.
[1000 BigOEasy]
解けなかった.
トポロジカルソートと思ったら違うみたい.
問題文を理解してEditorialを読んで後でまとめる(詳しくは
Login - TopCoder Wiki)
(問題文)
有向グラフが隣接行列が与えられる.
大きなLに対して,長さLの歩道の数が多項式関数で抑えられるかを判別する問題.
(方針)
ソースコード
[250 OneDimensionalRobotEasy]
#include <iostream> #include <vector> using namespace std; class OneDimensionalRobotEasy { public: int finalPosition(string commands, int A, int B) { const int n = commands.size(); int pos = 0; for (int i = 0; i < n; ++i) { if (commands[i] == 'R') { if (pos + 1 <= B) pos++; } else { // 'L' if (pos - 1 >= -A) pos--; } } return pos; } };
[500 MysticAndCandiesEasy]
#include <iostream> #include <vector> #include <algorithm> using namespace std; class MysticAndCandiesEasy { public: int minBoxes(int C, int X, vector <int> high) { const int n = high.size(); sort(high.begin(), high.end()); int res = n, sum = 0; for (int i = 0 ; i < n; ++i) { sum += high[i]; if (C - sum < X) { res = n - i; break; } } return res; } };