結果
問題 | No.626 Randomized 01 Knapsack |
ユーザー |
|
提出日時 | 2018-01-24 12:12:58 |
言語 | D (dmd 2.109.1) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,285 bytes |
コンパイル時間 | 801 ms |
コンパイル使用メモリ | 109,100 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 23:36:57 |
合計ジャッジ時間 | 2,063 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 WA * 1 |
ソースコード
import std.algorithm, std.conv, std.range, std.stdio, std.string; import std.typecons; // Tuple, Nullable, BigFlags void readV(T...)(ref T t){auto r=readln.splitter;foreach(ref v;t){v=r.front.to!(typeof(v));r.popFront;}} T[] readArray(T)(size_t n){auto a=new T[](n),r=readln.splitter;foreach(ref v;a){v=r.front.to!T;r.popFront;}return a;} T[] readArrayM(T)(size_t n){auto a=new T[](n);foreach(ref v;a)v=readln.chomp.to!T;return a;} void main() { int n; long w; readV(n, w); VW[] vw; foreach (i; 0..n) { long vi, wi; readV(vi, wi); if (wi <= w) vw ~= VW(vi, wi); } n = vw.length.to!int; vw.sort!((a, b) => a.v.to!real/a.w > b.v.to!real/b.w); auto p = 0L; auto lowerUpper(int k, VW q) { auto l = q, u = 0.0L; foreach (i; k..n) { if (l.w + vw[i].w > w) { u = l.v + (w-l.w).to!real/vw[i].w * vw[i].v; break; } l = l + vw[i]; } return tuple(l.v, max(u, l.v)); } auto dfs(int k, VW q) { if (q.w > w) return; if (k == n-1) return; auto lu = lowerUpper(k, q); if (lu[1] < p) return; if (lu[0] > p) p = lu[0]; dfs(k+1, q); dfs(k+1, q+vw[k]); } dfs(0, VW(0, 0)); writeln(p); } struct VW { long v, w; auto opBinary(string op: "+")(VW r) { return VW(v+r.v, w+r.w); } }