力扣第100场双周赛补题题解
将钱分给最多的儿童
class Solution {
public:
int distMoney(int money, int children) {
if(money < children){
return -1;
}
if(money <= 8*children){
money -= children;
if(money % 7 == 3 && money/7 == children-1){
return money/7-1;
}else{
return money/7;
}
}else{
return children-1;
}
}
};
第一种情况:美元数小于孩子数. 返回-1.
第二种情况:美元数小于等于8孩子数, 大于等于孩子数.
先给每个孩子一美元, 然后算出剩下的美元数能分成多少份7美元,
分好之后, 最后剩下的美元不会超过6美元,
剩下的只要不是3美元, 就可以直接分配给不满8美元的孩子, 不影响结果,
如果是3美元, 但不满8美元的孩子大于等于两人, 不影响结果,
如果不满8美元的孩子只有1人, 那么只能将3美元发给正好8美元的孩子, 返回值减1.
第三种情况:美元数大于8孩子数. 先给每个孩子8美元, 然后将多余的美元全部给到1个孩子上, 结果就是返回孩子数减1.
最大化数组的伟大值
class Solution {
public:
int maximizeGreatness(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
int pos=0;
int ans=0;
for(int i=0;i<n;++i){
while(pos < n && nums[pos] <= nums[i])
{
++pos;
}
if(pos == n){
ans = i;
break;
}
++pos;
}
return ans;
}
};
双指针.
将数组从小到大排好序后, 设指针i和指针pos, 指针i从0到n-1, 对每次指针i所指元素, 指针pos都循环自增找到一个恰好比指针i所指元素大的元素, 直到指针pos等于n结束
标记所有元素后数组的分数
class Solution {
public:
long long findScore(vector<int>& nums) {
int n = nums.size();
vector<pair<int, int>> tnums(n);
for(int i=0;i<n;++i){
tnums[i] = make_pair(nums[i], i);
}
sort(tnums.begin(), tnums.end(), [](pair<int, int> a, pair<int, int> b){
if(a.first != b.first){
return a.first < b.first;
}
return a.second < b.second;
});
map<int, bool> vis;
long long ret = 0;
for(int i=0;i<n;++i){
int num = tnums[i].first, pos = tnums[i].second;
if(!vis[pos]){
ret += num;
vis[pos] = 1;
if(pos == 0){
vis[1] = 1;
}else if(pos == n-1){
vis[n-2] = 1;
}else{
vis[pos-1] = 1, vis[pos+1] = 1;
}
}
}
return ret;
}
};
模拟.
将nums的值与下标组合放入新数组tnums, 按照值从小到大, 下标从小到大排序
写个map记录被选择的下标
遍历tnums, 然后当前元素的下标没有被选择过, 就将值加入到ret(score), 然后将当前下标和两边都打上标记.
返回ret.
修车的最少时间
class Solution {
public:
bool check(long long mid, int cars, vector<int>& ranks)
{
int n = ranks.size();
long long sum = 0;
for(int i=0;i<n;++i){
sum += (int)sqrt(1.0*mid/ranks[i]);
}
return sum >= cars;
}
long long repairCars(vector<int>& ranks, int cars) {
long long l = 0, r = 1e14;
while(l <= r)
{
long long mid = (l+r)/2;
if(check(mid, cars, ranks)){
r = mid-1;
}else{
l = mid+1;
}
}
return l;
}
};
二分.
二分修车的最少时间, 每次二分检查在当前时间下每名机械功最多修好车数之和.
文章详细介绍了力扣第100场双周赛中的四道算法题目,包括将钱分给最多儿童的问题,最大化数组的伟大值的策略,标记元素后的数组分数计算,以及修车的最少时间的二分查找解法。每道题目的解法都涉及到了不同的算法思想,如贪心、排序和二分查找。
697

被折叠的 条评论
为什么被折叠?



