2023-09-15每日一题
一、题目编号
LCP 50. 宝石补给
二、题目链接
点击跳转到题目位置
三、题目描述
欢迎各位勇者来到力扣新手村,在开始试炼之前,请各位勇者先进行「宝石补给」。
每位勇者初始都拥有一些能量宝石, gem[i] 表示第 i 位勇者的宝石数量。现在这些勇者们进行了一系列的赠送,operations[j] = [x, y] 表示在第 j 次的赠送中 第 x 位勇者将自己一半的宝石(需向下取整)赠送给第 y 位勇者。
在完成所有的赠送后,请找到拥有最多宝石的勇者和拥有最少宝石的勇者,并返回他们二者的宝石数量之差。
注意:
- 赠送将按顺序逐步进行。
示例 1:
示例 2:
示例 3:
提示:
- 2 <= gem.length <= 10^3
- 0 <= gem[i] <= 10^3
- 0 <= operations.length <= 10^4
- operations[i].length == 2
- 0 <= operations[i][0], operations[i][1] < gem.length
四、解题代码
class Solution {
public:
int giveGem(vector<int>& gem, vector<vector<int>>& operations) {
for(int i = 0; i < operations.size(); ++i){
int x = operations[i][0];
int y = operations[i][1];
int num = gem[x] / 2;
gem[x] -= num;
gem[y] += num;
}
int max0 = INT_MIN;
int min0 = INT_MAX;
for(int i = 0; i < gem.size(); ++i){
max0 = max(max0, gem[i]);
min0 = min(min0, gem[i]);
}
return max0 - min0;
}
};
五、解题思路
(1) 先按照题目模拟,将能量宝石进行转移。
(2) 线性枚举,找出修改后的最大值和最小值,然后求差值并返回即可。