勉強の記録

機械学習、情報処理について勉強した事柄など

整数問題で商にmath.ceilを使ってはいけない?

n/m以下の整数を使いたいときはn//mを使えばよいが,n/m以上の最小の整数に相当する演算子は存在しない.

そこで,横着してmath.ceilを使うと,答えがずれることがある.

ABC046 C - AtCoDeerくんと選挙速報 / AtCoDeer and Election Report atcoder.jp

誤り解法

import math

N=int(input())

T=1
A=1
for _ in range(N):
  t,a=list(map(int, input().split()))
  m = max(int(math.ceil(T/t)), int(math.ceil(A/a))))
  T = t*m
  A = a*m
  #print(T,A)
  
print(T+A)

これをするとtest caseのうち4件でWAとなる.

# 略
def divceil(a,b):
  if a%b==0:
    return a//b
  else:
    return a//b + 1

# 略
  m = max(divceil(T,t), divceil(A,a))

これならok.

T/tの部分が浮動小数点で計算されるので,割り切れるような場合であっても精度の末尾のところで微妙にずれる のだろうと推測.