結果
問題 | No.155 生放送とBGM |
ユーザー | koyumeishi |
提出日時 | 2015-07-17 22:01:15 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 4,509 ms / 6,000 ms |
コード長 | 1,796 bytes |
コンパイル時間 | 688 ms |
コンパイル使用メモリ | 84,044 KB |
実行使用メモリ | 149,728 KB |
最終ジャッジ日時 | 2024-07-08 08:32:40 |
合計ジャッジ時間 | 16,309 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2,775 ms
79,604 KB |
testcase_01 | AC | 2,153 ms
73,140 KB |
testcase_02 | AC | 543 ms
24,832 KB |
testcase_03 | AC | 334 ms
17,396 KB |
testcase_04 | AC | 61 ms
8,832 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 4,509 ms
149,728 KB |
testcase_07 | AC | 4 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 5 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 6 ms
5,376 KB |
testcase_12 | AC | 6 ms
5,376 KB |
testcase_13 | AC | 3 ms
5,376 KB |
testcase_14 | AC | 1,941 ms
67,524 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]; } cerr << L << " " << sum << endl; 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>(sum+1, 0)); dp[0][0] = 1; for(int i=0; i<n; i++){ auto dp_ = dp; for(int t=S[i]; t<sum; t++){ for(int j=1; j<=n; j++){ dp_[j][t] += dp[j-1][t - S[i]]; } } swap(dp, dp_); } 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>(sum+1, 0)); for(int i=0; i<n; i++){ for(int j=0; j<=n; j++){ for(int k=0; k<=sum; 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]) ; } } } cerr << ans << endl; cerr << fact[n] << endl; ans /= fact[n]; printf("%.18f\n", ans); return 0; }