第18回情報オリンピック予選過去問1
JOI 君は明日から新たにソーシャルゲームを始めることにした.
このソーシャルゲームでは,1 日につき 1 回までログインすることができ,ログインするたびに A 枚のコインが得られる.
また,月曜日から日曜日まで 7 日連続でログインすると,そのたびに,追加で B 枚のコインが得られる.
これ以外にコインがもらえることはない.
明日は月曜日である.JOI 君が少なくとも C 枚のコインを得るためにログインしなければならない回数の最小値を求めよ.
制約
1 ≦ A ≦ 1000
0 ≦ B ≦ 1000
1 ≦ C ≦ 1000000
入力は以下の形式で標準入力から与えられる.
A B C
解答例
code:ans1.c
int main(void)
{
int a, b, c, i, s;
scanf("%d%d%d", &a, &b, &c);
s = 0;
for (i = 1; i <= 1000000; i++) {
s += a;
if (i % 7 == 0) s += b;
if (s >= c) break;
}
printf("%d\n", i);
return 0;
}
上のコードで十分だが,もっと速くするためには,次のように考える。1週間で $ 7a+b 枚コインが得られるので,ざっくり $ w = \lfloor c / (7a+b) \rfloor 週かかる。あと $ r 枚必要であれば,あと $ d = \lceil r / a \rceil 日または7日の少ない方の日数を要する。このことを使えば,次のように計算できる:
code:ans2.c
int main(void)
{
int a, b, c, w, r, d;
scanf("%d%d%d", &a, &b, &c);
w = c / (7 * a + b);
r = c % (7 * a + b);
d = (r + a - 1) / a;
if (d > 7) d = 7;
d += 7 * w;
printf("%d\n", d);
return 0;
}