首页 > 编程语言 >【3.4】贪心算法-解按要求补齐数组

【3.4】贪心算法-解按要求补齐数组

时间:2024-08-30 10:50:28浏览次数:14  
标签:std index nums int long 3.4 total 补齐 贪心

一、问题

        给定一个 已排序 的正整数数组nums,和一个正整数n。从[1, n]区间内选取任意个数字补充到 nums 中 , 使 得 [1,n] 区 间 内 的 任 何 数 字 都 可 以 用 nums 中 某 几 个 数 字 的 和 来 表示。请输出满足上述要求的最少需要补充的数字个数。

二、解题思路

 

三、代码实现

一起来看看代码实现:

#include <iostream>
#include <vector>

int minPatches(std::vector<int>& nums, int n) {
    // 累加的总和
    long long total = 0;
    // 需要补充的数字个数
    int count = 0;
    // 访问的数组下标索引
    int index = 0;
    while (total < n) {
        if (index < nums.size() && nums[index] <= total + 1) {
            // 如果数组能组成的数字范围是[1,total],那么加上nums[index]
            // 就变成了[1,total]U[nums[index],total+nums[index]]
            // 结果就是[1,total+nums[index]]
            total += nums[index++];
        } else {
            // 添加一个新数字,并且count加1
            total = total + (total + 1);
            count++;
        }
    }
    return count;
}

int main() {
    std::vector<int> nums = {1, 5, 10};
    int n = 20;
    int result = minPatches(nums, n);
    std::cout << "需要补充的数字个数: " << result << std::endl;
    return 0;
}
        上面组成数字的范围是闭区间,我们还可以改成开区间 [ 1 , total ) ,原理都一样,稍作 修改即可,代码如下

#include <iostream>
#include <vector>

int minPatches(std::vector<int>& nums, int n) {
    // 累加的总和
    long long total = 1;
    // 需要补充的数字个数
    int count = 0;
    // 访问的数组下标索引
    int index = 0;
    while (total <= n) {
        if (index < nums.size() && nums[index] <= total) {
            // 如果数组能组成的数字范围是[1,total),那么加上nums[index]
            // 就变成了[1,total)U[nums[index],total+nums[index])
            // 结果就是[1,total+nums[index])
            total += nums[index++];
        } else {
            // 添加一个新数字,并且count加1
            total <<= 1;
            count++;
        }
    }
    return count;
}

int main() {
    std::vector<int> nums = {1, 5, 10};
    int n = 20;
    int result = minPatches(nums, n);
    std::cout << "需要补充的数字个数: " << result << std::endl;
    return 0;
}

标签:std,index,nums,int,long,3.4,total,补齐,贪心
From: https://blog.csdn.net/linshantang/article/details/141670985

相关文章

  • Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]
    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题。贪心破环成链的trick自然不用多说。首先观察题目,很容易发现一个性质:只走一圈的方案一定最优。这个很容易证,因为再绕一圈回来标记前面的和等前面的标记完之后继续走是等价的,并且再绕一圈甚至可能更劣。于是,我们只用走......
  • 代码随想录算法训练营第二十九天(贪心 三)
    力扣题部分:134.加油站题目链接:.-力扣(LeetCode)题面:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为......
  • 力扣热题100_贪心算法_45_跳跃游戏
    文章目录题目链接解题思路解题代码题目链接45.跳跃游戏II给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i]......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • 牛客周赛 Round 57 D-小红的线段(贪心)
     示例1输入2-1200011011输出112N34Y说明连接第一个点和第二个点,和直线没有交点。连接第三个点和第四个点,和直线有交点。 贪心策略:把点集分为三部分,直线上方m1、直线下方m2以及在直线上m3,我们可以发现:m1中的点和m2中的任意点相连都能通过直线;m3......
  • 贪心模型
    邻项交换模型邻项交换十分的重要,因为他是一个不可替代的算法。需要知道什么时候使用邻项交换,没有固定的形态,需要通过做题形成一种经验。P1080国王游戏题目描述有\(n\)个人,每一个人左手写了\(a_i\),右手写了\(b_i\)。需要确定一个\(1,2,\dots,n\)的排列\(p\),使得最......
  • 信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪
    1完善程序(单选题,每小题3分,共30分)郊游活动有n名同学参加学校组织的郊游活动,已知学校给这n名同学的郊游总经费为A元,与此同时第i位同学自己携带了Mi元。为了方便郊游,活动地点提供B(≥n)辆自行车供人租用,租用第j辆自行车的价格为Cj元,每位同学可以使用自己携带的钱或......
  • 数列(贪心思维题)(很有意思哦)(读者 rp +++++++)
    数列(贪心思维题)(很有意思哦)(读者rp+++++++)序这是前段时间做的一道题,蛮有思维含量的,而且对于代码实现能力也有一定要求。作者也交了好多发......
  • c++贪心、模拟超详细讲解
    一、贪心算法基础1.1定义与原理定义:贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。原理:贪心算法通过局部最优选择来构造全局最优解。在每一步,算法都做出一个看起来最优的决策,期望通过局部最优达到全局......
  • 力扣热题100_贪心算法_55_跳跃游戏
    文章目录题目链接解题思路解题代码题目链接55.跳跃游戏给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。示例1:输入:nums=[......