6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonで競プロに挑む日誌 vol.18 ~実行時間が満たせない~

Last updated at Posted at 2018-11-14

現在の目標

  • 2018年内に茶色になる←イマココ
  • ABC の A, B 問題を全部解く
  • 2018年度内に緑色を取得する
  • 水色になったら, APG4b で C++ にも手を出す

今日のおはなし

結論

計算方法が合っていても, 現実的な時間内に終わらないとダメ.

解いた問題

B - Between a and b ...

答えは出せるけど, 実行時間 2sec が満足できなかった解答

TLE_answer.py
# coding: utf-8
a, b, x = map(int, input().split())
cnt = 0
n = b - a + 1
for i in range(n):
    if (a+i)%x==0:
        cnt += 1
print(cnt)

総当たりだと, b が大きくなった時に制限時間内に処理が終わらず Out でした.

AC だった解答

解説をみたところ,

a 以上 b 以下の整数のうち条件を満たすものの個数を求める問題です.このような問題では,
「f(n) := 0 以上 n 以下の整数のうち条件を満たすものの個数」
と定義しておくと,答えは f(b)−f(a−1) で求まるので楽です.

とありました. 文章だけではよくわからなったので, 図示してみると理解できました(plantUML 使ってみたかっただけです↓).
figure1.png

for 文で a ~ b の区間を総当たりするのではなく, b の個数から a の個数を引けば, 所望の範囲の個数が求められるという話ですね(日本語が正確でない点はご容赦ください). 当然といえば当然のことです.

AC_answer.py
# coding: utf-8
a, b, x = map(int, input().split())
f_a = (a-1)//x + 1 if a>=1 else 0
f_b = b//x + 1
print(f_b - f_a)

いまはコード書くだけで楽しいのですが, 少しずつ実行時間にも気をつけないといけませんね.

むすび

制約を見て, 力技が通用するか確認しよう.

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?