結果

問題 No.155 生放送とBGM
ユーザー 古寺いろは古寺いろは
提出日時 2015-03-26 09:26:13
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 131 ms / 6,000 ms
コード長 1,222 bytes
コンパイル時間 1,140 ms
コンパイル使用メモリ 146,288 KB
実行使用メモリ 26,356 KB
最終ジャッジ日時 2023-09-11 10:17:26
合計ジャッジ時間 3,004 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 125 ms
22,764 KB
testcase_01 AC 127 ms
22,992 KB
testcase_02 AC 131 ms
26,356 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 8 ms
12,568 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 110 ms
19,052 KB
testcase_07 AC 3 ms
5,772 KB
testcase_08 AC 2 ms
5,600 KB
testcase_09 AC 3 ms
6,156 KB
testcase_10 AC 2 ms
5,612 KB
testcase_11 AC 3 ms
6,132 KB
testcase_12 AC 3 ms
6,284 KB
testcase_13 AC 3 ms
5,868 KB
testcase_14 AC 98 ms
21,884 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"
using namespace std;


int getnum(char c){
	return c - '0';
}

double dp[51][36002];
double predp[51][36002];
double functional[51];
int S[51];

int main() {
	int N, L;
	cin >> N >> L;
	L *= 60;
	double ans = 0;
	int sum = 0;
	for (int i = 0; i < N; i++)
	{
		string temp;
		cin >> temp;
		int time = getnum(temp[0]) * 600 + getnum(temp[1]) * 60 + getnum(temp[3]) * 10 + getnum(temp[4]);
		if (time > L) time = L;
		S[i] = time;
		sum += time;
	}

	if (L >= sum){
		cout << N << endl; return 0;
	}
	
	dp[0][0] = 1;
	for (int i = 0; i < N; i++)
	{
		for (int j = i; j >= 0; j--)
		{
			for (int k = 0; S[i] + k <= L * 2; k++)
			{
				if (!dp[j][k]) continue;
				dp[j + 1][S[i] + k] += dp[j][k];
			}
		}
	}

	functional[0] = 1;
	for (int i = 1; i < 51; i++)
	{
		functional[i] = functional[i - 1] * i;
	}

	double sump = 0;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			for (int k = 0; k < L; k++)
			{
				predp[j][k] = dp[j][k];
				if (j - 1 >= 0 && k - S[i] >= 0){
					predp[j][k] -= predp[j - 1][k - S[i]];
				}
				sump += predp[j][k] * functional[N - j - 1] * functional[j];
			}
		}
	}
	sump /= functional[N];
	ans += sump;
	printf("%.14f", ans);
	cin >> ans;
}

0