File tree 2 files changed +645
-0
lines changed
topcoder/2022-03-29_srm826
2 files changed +645
-0
lines changed Original file line number Diff line number Diff line change
1
+
2
+ // ! ---------------------------------------------------------------------------
3
+
4
+ #include < bits/stdc++.h>
5
+ using ll = long long ;
6
+ using namespace std ;
7
+ template <class T > using V = vector<T>;
8
+
9
+
10
+
11
+ struct TwoFairDice {
12
+
13
+ ll finish (vector<int >& A, vector<int >& B) {
14
+ vector<ll> helper (13 ); // h[k] = num ways to have 2*W + Draws add up to k.
15
+
16
+ auto get_score = [&](int k) {
17
+ int score = 0 ;
18
+ for ( int idx = 0 ; idx < 6 ; ++idx ) {
19
+ if ( k > A[idx] ) {
20
+ score += 2 ;
21
+ } else if ( k == A[idx] ) {
22
+ score += 1 ;
23
+ }
24
+ }
25
+ return score;
26
+ };
27
+
28
+ for ( int k = 0 ; k <= 1000 ; ++k ) {
29
+ int score = get_score (k);
30
+ ++helper[score];
31
+ }
32
+
33
+ V<V<ll>> dp (7 , V<ll>(73 ));
34
+ // insert the faces we're already given.
35
+ int score_already = 0 ;
36
+ int faces_already = 0 ;
37
+ for ( auto & x : B ) {
38
+ int score = get_score (x);
39
+ score_already += score;
40
+ ++faces_already;
41
+ }
42
+ dp[faces_already][score_already] = 1 ;
43
+
44
+ for ( int face = faces_already ; face < 6 ; ++face ) {
45
+ for ( int score = 0 ; score <= 12 ; ++score ) {
46
+ ll ways = helper[score];
47
+ for ( int prev_score = 0 ; prev_score <= 36 ; ++prev_score ) {
48
+ dp[face + 1 ][prev_score + score] += dp[face][prev_score] * ways;
49
+ }
50
+ }
51
+ }
52
+
53
+ return dp[6 ][36 ];
54
+ }
55
+ };
56
+
You can’t perform that action at this time.
0 commit comments