目录
- 2833. 距离原点最远的点
- 2834. 找出美丽数组的最小和
- 2835. 使子序列的和等于目标的最少操作次数
- TODO 2836. 在传球游戏中最大化函数值
这场比赛排名第 1 - 1000 名的参赛者 可获「NIO 蔚来」简历内推机会,比有的场次前十才给容易多了。
2833. 距离原点最远的点
距离原点最远的点
注意是移动n次后,不是移动过程中。
可以分为最靠左的点和最靠右的点,就是把_
都换成L
或R
。
然后计算左右的差,求绝对值。
O(n)
class Solution {
public:
int furthestDistanceFromOrigin(string moves) {
int LCnt = 0;
int RCnt = 0;
int allCnt = 0;
int ans = 0;
for(int i=0;i<(int)moves.length();i++){
if(moves[i]=='L'){
LCnt++;
}else if(moves[i]=='R'){
RCnt++;
}else{
allCnt++;
}
}
ans = max(ans, max(abs(LCnt+allCnt-RCnt),abs(RCnt+allCnt-LCnt)));
return ans;
}
};
2834. 找出美丽数组的最小和
找出美丽数组的最小和
每一对和为目标值的两个数只能选一个,显然应该选小的。
所以简单起见从1开始枚举,检查和之前的值和不为目标值,用哈希表记录。
O(n)
class Solution {
public:
long long minimumPossibleSum(int n, int target) {
unordered_set<int> st;
long long ans = 0;
int now = 1;
for(int i=1;i<=n;i++){
while(st.count(target-now)){
++now;
}
st.insert(now);
ans+=now;
++now;
}
return ans;
}
};
2835. 使子序列的和等于目标的最少操作次数
使子序列的和等于目标的最少操作次数
以2为底取对数,记录每种2的幂的个数。
对于target中的每个为1的二进制位,要么用1个对应位nums中的数,要么用多个低位的数加起来,实在不行从高位借位(记录成本)。
最后检查最高位是否存在借不到的情况,输出-1。
O(n)
class Solution {
public:
int minOperations(vector<int>& nums, int target) {
unordered_map<int,int> mp;
for(int i=0;i<=30;i++){
mp[1<<i] = i;
}
int a[50] = {};
for(const auto&v: nums){
++a[mp[v]];
}
int b[50] = {};
int ans = 0;
for(int i=0;i<=30;i++){
if(target&(1<<i)){
b[i] = b[i]+a[i]-1;
}else{
b[i] = b[i]+a[i];
}
if(b[i]<0){
//cout<<"! " <<i<<endl;
ans+=(-b[i]+1)/2;
b[i+1]-=(-b[i]+1)/2;
b[i] = (-b[i])%2;
}else if(b[i]>0){
b[i+1] += b[i]/2;
b[i]%=2;
}
//if(b[i])cout<<"i "<<i<<" "<<b[i]<<endl;
}
if(b[31]<0){
return -1;
}
return ans;
}
};
TODO 2836. 在传球游戏中最大化函数值
在传球游戏中最大化函数值
想出最优的正解了,但是没写完。
传球过程形成基环内向森林(一个点的自环也算环)。
- 对于环上的点,答案是若干个整环求和,加首尾零散的部分,可以用前缀和求区间和。
- 对于不在环上的点,维护一个栈,保存到环过程中的权值。维护一个值,保存当前点到环(至多含k个值)的权值和。不足k时,加上环上部分,可能是一段,或若干个整环加首尾零散的部分。
O(n)
class Solution {
public:
long long getMaxFunctionValue(vector<int>& receiver, long long k) {
}
};