题目描述
在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] = [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列 ,每个 positioni 互不相同 。
另给你两个整数 startPos 和 k 。最初,你位于 startPos 。从任何位置,你可以选择 向左或者向右 走。在 x 轴上每移动 一个单位 ,就记作 一步 。你总共可以走 最多 k 步。你每达到一个位置,都会摘掉全部的水果,水果也将从该位置消失(不会再生)。
返回你可以摘到水果的 最大总数 。
Coding it
class Solution {
public:
int cnt=0,max=0;
map<int,int> mp,mp1;
int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
for(auto &t:fruits)
if(t[0]<startPos) mp[startPos-t[0]]=t[1];
else if(t[0]==startPos) cnt+=t[1];
else mp1[t[0]-startPos]=t[1];
int start=mp.begin()->first,sum=mp.begin()->second;
for(auto &[a,b]:mp)
if(a!=start){
b+=sum;
sum=b;
}
start=mp1.begin()->first,sum=mp1.begin()->second;
for(auto &[a,b]:mp1)
if(a!=start){
b+=sum;
sum=b;
}
for(auto &[a,b]:mp){ //先往左走
if(a>k) break;
int val=b;
auto t=mp1.upper_bound(k-2*a);
if(k-2*a>0&&t!=mp1.begin())
val+=(--t)->second;
if(val>max) max=val;
}
for(auto &[a,b]:mp1){ //再往右走
if(a>k) break;
int val=b;
auto t=mp.upper_bound(k-2*a);
if(k-2*a>0&&t!=mp.begin())
val+=(--t)->second;
if(val>max) max=val;
}
return max+cnt;
}
};