結果
| 問題 |
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]])
codewow1