結果
| 問題 | 
                            No.54 Happy Hallowe'en
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2017-02-16 15:43:38 | 
| 言語 | D  (dmd 2.109.1)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 28 ms / 5,000 ms | 
| コード長 | 715 bytes | 
| コンパイル時間 | 809 ms | 
| コンパイル使用メモリ | 124,252 KB | 
| 実行使用メモリ | 7,244 KB | 
| 最終ジャッジ日時 | 2024-06-12 07:04:35 | 
| 合計ジャッジ時間 | 1,563 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 19 | 
ソースコード
import std.algorithm, std.conv, std.range, std.stdio, std.string;
import std.bitmanip;  // BitArray
void main()
{
  auto n = readln.chomp.to!size_t;
  auto vti = n.iota.map!(_ => readln.split.to!(int[])).map!(rd => VT(rd[0], rd[1])).array;
  vti.sort!"a.v + a.t < b.v + b.t";
  auto maxV = vti.back.v + vti.back.t;
  auto dp = BitArray();
  dp.length(maxV);
  dp[0] = true;
  foreach (vt; vti) {
    auto dp2 = dp & mask(vt.t, dp.length);
    dp2 <<= vt.v;
    dp |= dp2;
  }
  writeln(dp.bitsSet.tail(1).front);
}
auto mask(int t, size_t sz)
{
  auto b = new size_t[]((sz + 63) / 64);
  b[0..t/64][] = size_t.max;
  b[t/64] = (size_t(1) << (t % 64)) - 1;
  return BitArray(b, sz);
}
struct VT { int v, t; }