結果
問題 | No.155 生放送とBGM |
ユーザー | izuru_matsuura |
提出日時 | 2016-02-18 22:44:27 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,219 bytes |
コンパイル時間 | 1,842 ms |
コンパイル使用メモリ | 174,064 KB |
実行使用メモリ | 173,488 KB |
最終ジャッジ日時 | 2024-09-22 12:07:28 |
合計ジャッジ時間 | 16,546 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | -- | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
ソースコード
#include <bits/stdc++.h> using namespace std; namespace { typedef double real; typedef long long ll; template<class T> ostream& operator<<(ostream& os, const vector<T>& vs) { if (vs.empty()) return os << "[]"; os << "[" << vs[0]; for (int i = 1; i < vs.size(); i++) os << " " << vs[i]; return os << "]"; } template<class T> istream& operator>>(istream& is, vector<T>& vs) { for (auto it = vs.begin(); it != vs.end(); it++) is >> *it; return is; } int to_i(string s) { istringstream is(s); int n; is >> n; return n; } int N, L; vector<int> S; void input() { cin >> N >> L; L *= 60; S.resize(N); for (int i = 0; i < N; i++) { string buf; cin >> buf; int m = to_i(buf.substr(0, 2)); int s = to_i(buf.substr(3, 2)); S[i] = m * 60 + s; } } ll COMB[100][100]; void init(int N, int K) { for (int i = 0; i <= N; i++) for (int j = 0; j <= K; j++) COMB[i][j] = 0; COMB[0][0] = 1; for (int n = 1; n <= N; n++) { COMB[n][0] = 1; for (int k = 1; k <= K; k++) { COMB[n][k] = (COMB[n - 1][k - 1] + COMB[n - 1][k]); } } } ll comb(int N, int K) { if (N < K) return 0; return COMB[N][K]; } int sum(int bit, const vector<int>::iterator& from, const vector<int>::iterator& to) { int ans = 0; int n = to - from; for (int i = 0; i < n; i++) { if (bit & (1 << i)) { ans += *(from + i); } } return ans; } void solve() { init(N, N); vector< vector<ll> > A(N + 1, vector<ll>(N + 1, 0)); for (int i = 0; i < N; i++) { vector<int> ss; for (int j = 0; j < N; j++) { if (i == j) continue; ss.push_back(S[j]); } int M1 = (N - 1) / 2; int M2 = (N - 1) - M1; vector< vector<int> > xs(N); for (int bit = 0; bit < (1 << M2); bit++) { int s = sum(bit, ss.begin() + M1, ss.end()); //cout << bit << " && " << s << endl; xs[__builtin_popcount(bit)].push_back(s); } for (int j = 0; j < N; j++) { sort(xs[j].begin(), xs[j].end()); //cout << j << " -> " << xs[j] << endl; } for (int bit = 0; bit < (1 << M1); bit++) { int s = sum(bit, ss.begin(), ss.begin() + M1); int cnt = __builtin_popcount(bit); for (int j = 0; j < N; j++) { int y = upper_bound( xs[j].begin(), xs[j].end(), L - s - 1 ) - xs[j].begin(); A[i][cnt + j] += y; } } } real ans = 0; for (int i = 0; i < N; i++) { for (int k = 0; k < N; k++) { ans += (1.0 / N) * (real(A[i][k]) / comb(N - 1, k)); } } cout << setprecision(15) << ans << endl; } } int main() { input(); solve(); return 0; }