Skip to content

Commit bcdb49c

Browse files
authored
Update 2106.Maximum-Fruits-Harvested-After-at-Most-K-Steps_v1.cpp
1 parent 2a60339 commit bcdb49c

File tree

1 file changed

+18
-46
lines changed

1 file changed

+18
-46
lines changed

Binary_Search/2106.Maximum-Fruits-Harvested-After-at-Most-K-Steps/2106.Maximum-Fruits-Harvested-After-at-Most-K-Steps_v1.cpp

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,61 +4,33 @@ class Solution {
44
{
55
int n = fruits.size();
66
vector<int>pos(n);
7-
vector<int>val(n);
8-
for (int i=0; i<n; i++)
9-
{
10-
pos[i] = fruits[i][0];
11-
val[i] = fruits[i][1];
12-
}
137
vector<int>presum(n);
14-
int cur = 0;
158
for (int i=0; i<n; i++)
169
{
17-
cur += val[i];
18-
presum[i] = cur;
10+
pos[i] = fruits[i][0];
11+
presum[i] = (i==0?0:presum[i-1]) + fruits[i][1];
1912
}
20-
13+
2114
int ret = 0;
22-
int j = 0;
23-
while (j<n && pos[j]<startPos) j++;
24-
for (int i=0; i<n && pos[i]<=startPos; i++)
15+
int mid = upper_bound(pos.begin(), pos.end(), startPos) - pos.begin();
16+
int j = n-1;
17+
for (int i=mid-1; i>=0; i--)
2518
{
26-
while (j<n && (startPos-pos[i]+(pos[j]-startPos)*2) <= k)
27-
{
28-
ret = max(ret, presum[j] - (i==0 ? 0:presum[i-1]));
29-
j++;
30-
}
19+
while (pos[j]>=startPos && startPos-pos[i]+(pos[j]-startPos)*2 > k)
20+
j--;
21+
if (pos[j]>=startPos) ret = max(ret, presum[j] - (i==0?0:presum[i-1]));
22+
else if (startPos-pos[i] <= k) ret = max(ret, presum[j] - (i==0?0:presum[i-1]));
3123
}
32-
33-
j = n-1;
34-
while (j>=0 && pos[j]>startPos) j--;
35-
for (int i=n-1; i>=0 && pos[i]>=startPos; i--)
24+
25+
mid = lower_bound(pos.begin(), pos.end(), startPos) - pos.begin();
26+
j = 0;
27+
for (int i=mid; i<n; i++)
3628
{
37-
while (j>=0 && (pos[i]-startPos+(startPos-pos[j])*2 <=k))
38-
{
39-
40-
ret = max(ret, presum[i] - (j==0?0:presum[j-1]));
41-
j--;
42-
}
43-
}
44-
45-
int i = upper_bound(pos.begin(), pos.end(), startPos) - pos.begin()-1;
46-
int sum = 0;
47-
while (i>=0 && startPos-pos[i]<=k)
48-
{
49-
sum += val[i];
50-
i--;
51-
}
52-
ret = max(ret, sum);
53-
54-
i = lower_bound(pos.begin(), pos.end(), startPos) - pos.begin();
55-
sum = 0;
56-
while (i<n && pos[i]-startPos<=k)
57-
{
58-
sum += val[i];
59-
i++;
29+
while (pos[j]<=startPos && pos[i]-startPos+(startPos-pos[j])*2 > k)
30+
j++;
31+
if (pos[j]<=startPos) ret = max(ret, presum[i] - (j==0?0:presum[j-1]));
32+
else if (pos[i]-startPos <= k) ret = max(ret, presum[i] - (j==0?0:presum[j-1]));
6033
}
61-
ret = max(ret, sum);
6234

6335
return ret;
6436
}

0 commit comments

Comments
 (0)