Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

AtCoder Beginner Contest 165 感想&解説

2020/05/02 (土) 21:10-22:50に、AtCoder Beginner Contest 165 が開催されました!

皆さん、お疲れ様でしたー。https://atcoder.jp/contests/abc165

 

私は、ABの2完で撤退。今回はC問題のDifficultyが1197と、ほぼ水色近くのDifficultyでしたが、D問題はそれに対し505でした。

(C問題とD問題でDifficultyに壁が出来るのはよく見るのですが、今回の場合は

C問題とE問題の間にD問題の谷が出来ていたように感じます。)

 コンテスト成績証

ユーザ名 Rute
コンテスト名 AtCoder Beginner Contest 165
順位 6478th / 11719
パフォーマンス 524
レーティング 565 → 561 (-4)

 

では問題について振り返っていきましょう。

 

A問題 A-We Love Golf

https://atcoder.jp/contests/abc165/tasks/abc165_a

 

問題概要:

A以上B以下の整数の範囲のうち、Kの倍数があれば"OK",なければ"NG"と出力せよ。

 

100点問題でループ....!? と最初戸惑いました。私はループを用いてA以上B以内にKの倍数があるかを判定しました。

(これは、O(B-A+1)で高速です。)

ただ、回答例を見るとO(1)で解く解法もあったので、そういう考え方もあるのかと納得させられました。

コード: https://atcoder.jp/contests/abc165/submissions/12578851

 

B問題 B-1%

https://atcoder.jp/contests/abc165/tasks/abc165_b

問題概要:

100×1.01^{N}≧Xが成り立つNのうち、最小のものを求めよ。

 

最初、Dice And Coinのようにlogを用いて解くのかと思っていました。

<このような式変形を考えていました>

X≦100×1.01^{N}

\log_{1.01} X≦ \log_{1.01} 100 +\log_{1.01} 1.01^N

\log_{1.01} X≦\log_{1.01} 100+ N

\log_{1.01} X- \log_{1.01} 100 ≦ N

(これを満たす最小のNが答え)

ただ、式変形が間違っていたかどうか分からないのですが、計算結果がサンプルの出力と異なっていました。

 

よくよく考えると、X = 10^{18}の時、答えは3760となっていたので、

1001.01を掛け合わせて続け、掛け合わせた段階でXを超えていた時の年数を出力すればよかったのでした。(単純なループで良かったのです)

コード: https://atcoder.jp/contests/abc165/submissions/12592603

 

D問題 D - Floor Function

https://atcoder.jp/contests/abc165/tasks/abc165_d

 

問題概要:

A,B,Nという3つの整数が与えられます。

0≦x≦Nの範囲における、floor(Ax/B)-A×floor(x/B)の最大値を求めよ。

コンテスト中に解けなかったのですが、よくよく考えるとこれはwolframを利用すれば考えが容易になるということがわかりました。

 

wolframでこの関数のグラフを出力してみると、

f:id:Rute_programming:20200505144743p:plain

▲この関数を実行した結果のグラフです

このような出力になりました。よって、考えるのは0≦x≦B-1の範囲まででよく、

関数をf(x)としたときに、f(N)f(B-1)の値のうち最大のものを出力すればよかったということになります。

計算量は言うまでもなくO(1)です。

コード: https://atcoder.jp/contests/abc165/submissions/12846652

(コンテスト後で復習しました。)

 

以上、AtCoder Beginner Contest 164 感想 &解説でした。

(今回は茶Difficultyが解けなかったのがつらい....)