結果
| 問題 | No.155 生放送とBGM |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-25 17:04:22 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 1,119 ms / 6,000 ms |
| コード長 | 1,153 bytes |
| コンパイル時間 | 6,958 ms |
| コンパイル使用メモリ | 211,188 KB |
| 実行使用メモリ | 29,436 KB |
| 最終ジャッジ日時 | 2025-11-25 17:04:37 |
| 合計ジャッジ時間 | 11,382 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
module main;
// https://kmjp.hatenablog.jp/entry/2015/02/18/0900 より
// ARC028、戻すDP
import std;
void main()
{
// 入力
int N;
long L;
readln.chomp.formattedRead("%d %d", N, L);
L *= 60; // 時間から分に変換
long sum = 0;
auto S = new long[](N);
auto str = readln.split.to!(string[]);
foreach (i; 0 .. N) {
int x, y;
str[i].formattedRead("%d:%d", x, y);
S[i] = x * 60 + y;
sum += S[i];
}
// 答えの計算と出力
if (L >= sum) {
writeln(N);
return;
}
auto fact = new double[](80);
fact[0] = fact[1] = 1;
foreach (i; 2 .. 80)
fact[i] = fact[i - 1] * i;
auto dp = new long[][](22_005, 53);
dp[0][0] = 1;
foreach (i; 0 .. N) {
foreach_reverse (x; 0 .. i + 1) {
foreach (y; 0 .. 22_001)
dp[min(22_000, y + S[i])][x + 1] += dp[y][x];
}
}
auto dp2 = new long[][](22_005, 53);
double ans = 0;
foreach (i; 0 .. N) {
foreach (x; 0 .. N + 1) {
foreach (y; 0 .. L + S[i]) {
dp2[y][x] = dp[y][x];
if (y >= S[i] && x > 0) dp2[y][x] -= dp2[y - S[i]][x - 1];
if (x < N && y < L) ans += dp2[y][x] * fact[x] * fact[N - (x + 1)];
}
}
}
ans /= fact[N];
writefln("%.12f", ans);
}