結果
問題 | No.155 生放送とBGM |
ユーザー | koyumeishi |
提出日時 | 2015-07-17 22:08:16 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 155 ms / 6,000 ms |
コード長 | 1,668 bytes |
コンパイル時間 | 783 ms |
コンパイル使用メモリ | 82,060 KB |
実行使用メモリ | 18,172 KB |
最終ジャッジ日時 | 2024-07-08 08:26:48 |
合計ジャッジ時間 | 2,238 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 147 ms
18,044 KB |
testcase_01 | AC | 146 ms
18,048 KB |
testcase_02 | AC | 155 ms
18,172 KB |
testcase_03 | AC | 147 ms
17,408 KB |
testcase_04 | AC | 7 ms
5,376 KB |
testcase_05 | AC | 1 ms
5,376 KB |
testcase_06 | AC | 150 ms
18,172 KB |
testcase_07 | AC | 3 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 3 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 4 ms
5,376 KB |
testcase_12 | AC | 4 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 113 ms
15,360 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:23:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 23 | scanf("%d:%d", &m,&s); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <iostream> #include <vector> #include <cstdio> #include <sstream> #include <map> #include <string> #include <algorithm> #include <queue> #include <cmath> #include <set> using namespace std; int main(){ int n,L; cin >> n >> L; L *= 60; vector<int> S(n); int sum = 0; for(int i=0; i<n; i++){ int m,s; scanf("%d:%d", &m,&s); S[i] = m*60+s; sum += S[i]; } L = min(L, sum); /* dp[i][j][k] := i曲目までのうち j曲使って長さが k秒になる組み合わせ i をdpテーブルに記憶しておく必要はない for i dp[j][k] := j曲使って長さの総和が k秒になる組み合わせ dp[i][j][k] = dp[i-1][j-1][k-S[i-1]] + dp[i-1][j][k] <=> dp[i-1][j][k] = dp[i][j][k] - dp[i-1][j-1][k-S[i-1]] としてiを使わなかった組み合わせへ戻せる dp[n-1][j][k] = dp[n][j][k] - dp[n-1][j-1][k-S[n-1]] ここでn-1は任意 dp[n-1][j][k] = dp[n][j][k] - dp[n-1][j-1][k-S[n-1]] dp__[j][k] = dp[j][k] - dp__[j-1][k-S[n-1]] */ vector<vector<long long>> dp(n+1, vector<long long>(L+1, 0)); dp[0][0] = 1; for(int i=0; i<n; i++){ for(int j=n; j>0; j--){ for(int t=S[i]; t<L; t++){ dp[j][t] += dp[j-1][t - S[i]]; } } } vector<double> fact(n+10,1); for(int i=1; i<fact.size(); i++){ fact[i] = (fact[i-1] * i); } double ans = 0.0; vector<vector<long long>> dp__(n+1, vector<long long>(L+1, 0)); for(int i=0; i<n; i++){ for(int j=0; j<=n; j++){ for(int k=0; k<=L; k++){ dp__[j][k] = dp[j][k] - ((j-1>=0 && k-S[i]>=0)? dp__[j-1][k-S[i]] : 0); if(k<L) ans += dp__[j][k] * fact[j] * (n-1-j<0?0:fact[n-1-j]) ; } } } ans /= fact[n]; printf("%.18f\n", ans); return 0; }