-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path808.soup-servings.cpp
90 lines (89 loc) · 2.63 KB
/
808.soup-servings.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* @lc app=leetcode id=808 lang=cpp
*
* [808] Soup Servings
*
* https://leetcode.com/problems/soup-servings/description/
*
* algorithms
* Medium (37.64%)
* Likes: 99
* Dislikes: 352
* Total Accepted: 6.4K
* Total Submissions: 16.9K
* Testcase Example: '50'
*
* There are two types of soup: type A and type B. Initially we have N ml of
* each type of soup. There are four kinds of operations:
*
*
* Serve 100 ml of soup A and 0 ml of soup B
* Serve 75 ml of soup A and 25 ml of soup B
* Serve 50 ml of soup A and 50 ml of soup B
* Serve 25 ml of soup A and 75 ml of soup B
*
*
* When we serve some soup, we give it to someone and we no longer have it.
* Each turn, we will choose from the four operations with equal probability
* 0.25. If the remaining volume of soup is not enough to complete the
* operation, we will serve as much as we can. We stop once we no longer have
* some quantity of both types of soup.
*
* Note that we do not have the operation where all 100 ml's of soup B are used
* first.
*
* Return the probability that soup A will be empty first, plus half the
* probability that A and B become empty at the same time.
*
*
*
*
* Example:
* Input: N = 50
* Output: 0.625
* Explanation:
* If we choose the first two operations, A will become empty first. For the
* third operation, A and B will become empty at the same time. For the fourth
* operation, B will become empty first. So the total probability of A becoming
* empty first plus half the probability that A and B become empty at the same
* time, is 0.25 * (1 + 1 + 0.5 + 0) = 0.625.
*
*
*
* Notes:
*
*
* 0 <= N <= 10^9.
* Answers within 10^-6 of the true value will be accepted as correct.
*
*
*/
class Solution {
public:
unordered_map<int, unordered_map<int, double> > mm;
double callme(int depth, int a, int b){
if(a == 0 && b == 0){
return 0.5; //*pow(0.25, depth);
}
if(a == 0 || b == 0){
if(a == 0)
return 1; //pow(0.25, depth);
return 0;
}
if(mm.find(a)!=mm.end() && mm[a].find(b)!=mm[a].end())
return mm[a][b];
double ans = 0;
ans += 0.25*callme(depth+1, a - min(a,100), b);
ans += 0.25*callme(depth+1, a - min(a, 75), b - min(b, 25));
ans += 0.25*callme(depth+1, a - min(a, 50), b - min(b, 50));
ans += 0.25*callme(depth+1, a - min(a, 25), b - min(b, 75));
mm[a][b] = ans;
return ans;
}
double soupServings(int N) {
if(N>4800)
return 1;
mm.clear();
return callme(0, N, N); // A, B
}
};