結果
| 問題 | No.67 よくある棒を切る問題 (1) | 
| コンテスト | |
| ユーザー |  codewow1 | 
| 提出日時 | 2019-12-27 00:45:05 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                RE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,975 bytes | 
| コンパイル時間 | 304 ms | 
| コンパイル使用メモリ | 81,972 KB | 
| 実行使用メモリ | 114,972 KB | 
| 最終ジャッジ日時 | 2025-03-03 11:29:56 | 
| 合計ジャッジ時間 | 7,133 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | RE * 30 | 
ソースコード
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]])
            
            
            
        