結果
| 問題 |
No.2495 Three Sets
|
| ユーザー |
|
| 提出日時 | 2023-10-06 22:35:17 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,129 bytes |
| コンパイル時間 | 3,743 ms |
| コンパイル使用メモリ | 178,644 KB |
| 実行使用メモリ | 13,816 KB |
| 最終ジャッジ日時 | 2024-07-26 16:40:35 |
| 合計ジャッジ時間 | 8,989 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 10 TLE * 1 -- * 7 |
ソースコード
import std;
void main () {
// なるたけどれもデカいほうが良い。部分集合といいつつ、削るなら最小要素から削るべき(要素数は負にならないので、できるだけでかい方がお得)
// O(N^3)しかわからんけど...
int[3] N;
int[][3] X;
readln.read(N[0], N[1], N[2]);
X[0] = readln.split.to!(int[]);
X[1] = readln.split.to!(int[]);
X[2] = readln.split.to!(int[]);
solve(N, X);
}
void solve (int[3] N, int[][3] X) {
// O(N^3)
foreach (ref x; X) x.sort!"a>b";
int[][3] sum;
foreach (i, ref s; sum) s = new int[](N[i]+1);
foreach (idx, ref s; sum) foreach (i, ref ss; s) {
if (i == 0) { ss = 0; continue; }
ss = s[i-1] + X[idx][i-1];
}
long ans = -long.max;
for (int i = 0; i <= N[0]; i++) for (int j = 0; j <= N[1]; j++) for (int k = 0; k <= N[2]; k++) {
ans = max(ans, sum[0][i]*j + sum[1][j]*k + sum[2][k]*i);
}
writeln(ans);
}
void read(T...)(string S, ref T args) {
auto buf = S.split;
foreach (i, ref arg; args) {
arg = buf[i].to!(typeof(arg));
}
}