結果
| 問題 | No.3642 OHO SHI KA TSU(Buying ver.) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-24 00:16:22 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 316 ms / 2,000 ms |
| + 871µs | |
| コード長 | 1,009 bytes |
| 記録 | |
| コンパイル時間 | 2,317 ms |
| コンパイル使用メモリ | 339,792 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2026-08-25 13:33:32 |
| 合計ジャッジ時間 | 4,948 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 小課題1 | 5 % | AC * 4 |
| 小課題2 | 3 % | AC * 3 |
| 小課題3 | 2 % | AC * 3 |
| 小課題4 | 10 % | AC * 3 |
| 小課題5 | 15 % | AC * 3 |
| 小課題6 | 20 % | AC * 3 |
| 小課題7 | 30 % | AC * 3 |
| 小課題8 | 15 % | AC * 31 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void chmax(double &a, double b) {if(a < b) a = b;}
int main() {
int N, X, Y;
cin >> N >> X >> Y;
vector<int> W(N), V(N), C(N);
for(int i = 0; i < N; ++i) cin >> W[i] >> V[i] >> C[i];
vector<pair<int, double>> vec;
for(int i = 0; i < N; ++i) {
while(C[i] > 0) {
do {
vec.emplace_back(W[i], V[i]);
C[i] -= 1;
} while(C[i] % 2 == 1);
W[i] *= 2, V[i] *= 2, C[i] /= 2;
}
}
cout << fixed << setprecision(15);
auto check = [&](double A) {
vector<double> dp(X, -1e18);
for(auto [w, v] : vec) {
v -= w * A;
v += w / X * Y;
w %= X;
auto ndp = dp;
for(int i = 0; i < X; ++i) {
int ni = i + w;
chmax(ndp[ni % X], dp[i] + v + (ni < X ? 0 : Y));
}
chmax(ndp[w], v);
swap(dp, ndp);
}
for(auto x : dp) if(x >= 0) return true;
return false;
};
double ok = 0, ng = 1e6;
for(int _ = 0; _ < 50; ++_) {
double mid = (ok + ng) / 2;
(check(mid) ? ok : ng) = mid;
}
cout << ok << "\n";
}