少し考察が必要になる問題。結局隙間なく作れる。
問題概要
最初、黒板に 0 という数が書かれている。 秒後には、黒板に書かれた数 を以下のいずれかに置き換えることができる。
黒板に書かれた数を にできるのは最短で何秒後か?
制約
考えたこと
最初、「ちょうどぴったり にするのは難しそうだ」と悩んでしまった。しかし、手を動かしてみると、たとえば
- 1 秒後には、0, 1 が作れる
- 2 秒後には、0, 1, 2, 3 が作れる
- 3 秒後には、0, 1, 2, 3, 4 ,5, 6 が作れる
- ...
というように 0 から「毎回足してできる数」まで、1 刻みですべて作れることがわかる。一般に、次のことが言える。
秒後までには、 まですべて作れる
よって、問題は
を満たす最小の を求めることだ。これは、 と順番に試して行って、はじめて t * (t + 1) / 2 >= X
となる瞬間を捉えればよい。
の左辺は二次式なので、 まで試せば十分なため、計算量は となって間に合う。
コード
#include <bits/stdc++.h> using namespace std; int main() { long long X; cin >> X; for (long long i = 1; i <= X; i++) { if (i * (i + 1) / 2 >= X) { cout << i << endl; return 0; } } }