-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdaily2.cpp
115 lines (101 loc) · 3.25 KB
/
daily2.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Solution 1
class Solution {
public:
int m_bouquets(vector<int>& bloomDay, int& mid, int& m, int& k) {
auto bouquet = int{0};
auto count = int{0};
for (auto i = size_t{0}; i < bloomDay.size(); ++i) {
if (bloomDay[i] <= mid) count++;
else count = 0;
if (count == k) {
bouquet++;
count = 0;
}
if (bouquet == m) return true;
}
return false;
}
int minDays(vector<int>& bloomDay, int m, int k) {
if (static_cast<long>(m) * static_cast<long>(k) > bloomDay.size()) return -1;
auto left = *std::min_element(bloomDay.begin(), bloomDay.end());
if (m == 1 and k == 1) return left;
auto right = *std::max_element(bloomDay.begin(), bloomDay.end());
while (left <= right) {
auto mid = left + (right - left) / 2;
// std::cout << "left: " << left << ", right: " << right << ", mid: " << mid << "\n";
auto possible = m_bouquets(bloomDay, mid, m, k);
if (possible) {
right = mid - 1;
} else {
left = mid + 1;
}
mid = (left + right) / 2;
}
if (m_bouquets(bloomDay, left, m, k)) return left;
return -1;
}
};
// Solution 1.b
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
if (static_cast<long>(m) * static_cast<long>(k) > bloomDay.size()) return -1;
auto left = *std::min_element(bloomDay.begin(), bloomDay.end());
if (m == 1 and k == 1) return left;
auto right = *std::max_element(bloomDay.begin(), bloomDay.end());
auto result = int{-1};
while (left <= right) {
long mid = left + (right - left) / 2;
auto bouquet = int{0};
auto count = int{0};
for (auto i = size_t{0}; i < bloomDay.size(); ++i) {
if (bloomDay[i] <= mid) count++;
else count = 0;
if (count >= k) {
bouquet++;
count = 0;
}
}
if (bouquet >= m) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
};
// Solution 2
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
ios::sync_with_stdio(0);
cin.tie(0);
long long max = *max_element(bloomDay.begin(), bloomDay.end());
long long low = 0;
int answer = -1;
while (low <= max) {
long long day = low + (max - low) / 2;
int noOfBouquete = 0;
int count = 0;
for (int i = 0; i < bloomDay.size(); i++) {
if (bloomDay[i] <= day) {
count++;
} else {
count = 0;
}
if (count >= k) {
noOfBouquete++;
count = 0;
}
}
if (noOfBouquete >= m) {
answer = day;
max = day - 1;
} else if (noOfBouquete < m)
low = day + 1;
}
return answer;
}
};