結果
| 問題 |
No.949 飲酒プログラミングコンテスト
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-12 02:19:05 |
| 言語 | OCaml (5.2.1) |
| 結果 |
AC
|
| 実行時間 | 1,708 ms / 2,500 ms |
| コード長 | 1,022 bytes |
| コンパイル時間 | 467 ms |
| コンパイル使用メモリ | 21,704 KB |
| 実行使用メモリ | 172,668 KB |
| 最終ジャッジ日時 | 2024-10-09 00:53:16 |
| 合計ジャッジ時間 | 17,193 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
let get_int () = Scanf.scanf " %d" (fun x -> x) ;;
let () =
let n = get_int () in
let a = Array.init (n+1) (fun _ -> get_int ()) in
let b = Array.init (n+1) (fun _ -> get_int ()) in
let d = Array.init n (fun _ -> get_int ()) in
Array.sort (fun x y -> compare y x) d;
let l = ref 0 in
let r = ref (n+1) in
while !r - !l > 1 do
let m = (!l + !r)/2 in
let dp = Array.make_matrix (m+1) (m+1) false in
dp.(0).(0) <- true;
for i=0 to m-1 do for j=0 to m-1 do
if i+j<m && dp.(i).(j) then begin
if a.(i+1) + b.(j) >= d.(i+j+n-m) then
dp.(i+1).(j) <- true;
if a.(i) + b.(j+1) >= d.(i+j+n-m) then
dp.(i).(j+1) <- true;
end
done done;
let mx = ref 0 in
for i=0 to m do for j=0 to m do
if dp.(i).(j) then mx := max !mx (i+j)
done done;
if !mx = m then l := m else r := m
done;
Printf.printf "%d\n" !l
;;