結果

問題 No.67 よくある棒を切る問題 (1)
ユーザー codewow1codewow1
提出日時 2019-12-27 00:45:05
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,975 bytes
コンパイル時間 1,480 ms
コンパイル使用メモリ 81,860 KB
実行使用メモリ 114,440 KB
最終ジャッジ日時 2024-10-05 13:53:47
合計ジャッジ時間 7,255 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 WA -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

import pdb

N = int(input())
L = list(map(int, input().split()))
K = int(input())

# 1~Nの間で、その値がNほんの棒で作れるかを二分探索し、最大値を求める

# 1, 2, ..., N の配列を作成
sorted_arr =[i for i in range(1,max(L)+1)]

# pが答えだと仮定したとき、
# math.floor(Li/p)の合計値がK以上ならOK

import math

def chk_func(p):
  sum = 0
  for Li in L:
    sum += math.floor(Li/p)
  return sum >= K

#### 二分探索 O(logN) ####
## ソート済み配列sorted_arrの中にTrueとFalseの境界が存在
## すべてTrue または すべてFalseもありうる
def binary_search(sorted_arr):
  # 境目のうちTrue側のindexを返す。すべてTrueまたはFalseのときは-1を返す
  # 加えてindex=0の真偽値を返す
  # ref : 条件式に用いるための変数

  # pdb.set_trace()

  # 配列の一番最初と最後の要素がそれぞれ条件を満たすかどうか
  TF_left = chk_func(sorted_arr[0])
  TF_right = chk_func(sorted_arr[-1])

  if TF_left == TF_right:
    # 両方が条件を満たす(または両方が条件を満たさない)場合は終了
    # 2番目の返り値に、両方の値(TrueかFalse)が入る
    return -1, TF_left
  else:
    if TF_right:
      # 最後の要素がTrueの場合、
      ok = len(sorted_arr)    # 末尾側をTrueにし、
      ng = -1                 # 先頭側をFalseにする
    else:
      # 最初の要素がTrueの場合、
      ok = -1                 # 先頭側をTrueにし、
      ng = len(sorted_arr)    # 末尾側をFalseにする

  while (abs(ok - ng) > 1):   # 境目が確定するまで繰り返す
    mid = int((ok + ng)/2)
    if chk_func(sorted_arr[mid]):
      ok = mid
    else:
      ng = mid
  # ok : 境目のうち、True側の配列インデックス
  # 2番目の引数は途中終了の場合との整合性をとるため。
  return ok, True

print(sorted_arr[binary_search(sorted_arr)[0]])
0