結果

問題 No.3634 Made to order
コンテスト
ユーザー 👑 ssmbc2929_bartok
提出日時 2026-07-07 15:47:06
言語 C++23
(gcc 15.2.0 + boost 1.90.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,220 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,205 ms
コンパイル使用メモリ 346,792 KB
実行使用メモリ 9,412 KB
最終ジャッジ日時 2026-08-21 20:55:49
合計ジャッジ時間 4,413 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
サブタスク $1$ 20 % AC * 8
サブタスク $2$ 10 % AC * 17 WA * 4
サブタスク $3$ 70 % AC * 17 WA * 9
合計 3 * 20% = 60 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

// --- 初期設定(入出力の高速化と小数15桁出力) ---
struct Init {
  Init() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
  }
} init;
// ------------------------------------------------

// Johnson法解法
int main() {
  int N, D;
  cin >> N >> D;

  vector<int> a(N), b(N), c(N);
  for (int i = 0; i < N; i++) {
    cin >> a[i] >> b[i] >> c[i];
  }

  // 各ジョブを (P1, P2, id) の形で持ち、A/B に振り分け
  vector<int> A, B;
  for (int i = 0; i < N; i++) {
    if (a[i] + b[i] <= b[i] + c[i])
      A.push_back(i);
    else
      B.push_back(i);
  }
  sort(A.begin(), A.end(), [&](int i, int j) { return a[i] + b[i] < a[j] + b[j]; });
  sort(B.begin(), B.end(), [&](int i, int j) { return b[i] + c[i] > b[j] + c[j]; });

  vector<int> order;
  order.reserve(N);
  for (int i : A) order.push_back(i);
  for (int i : B) order.push_back(i);

  //Johnson法で納期計算
  int t1 = 0, t2 = 0, t3 = 0;
  for (int i : order) {
    t1 = t1 + a[i];
    t2 = max(t1, t2) + b[i];
    t3 = max(t2, t3) + c[i];
  }
  cout << (t3 <= D ? "Yes" : "No") << endl;

  return 0;
}
0