【力扣周赛】第350场周赛

这篇具有很好参考价值的文章主要介绍了【力扣周赛】第350场周赛。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2739. 总行驶距离

题目描述

描述:卡车有两个油箱。给你两个整数,mainTank 表示主油箱中的燃料(以升为单位),additionalTank 表示副油箱中的燃料(以升为单位)。

该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了 5 升燃料时,如果副油箱至少有 1 升燃料,则会将 1 升燃料从副油箱转移到主油箱。

返回卡车可以行驶的最大距离。

注意:从副油箱向主油箱注入燃料不是连续行为。这一事件会在每消耗 5 升燃料时突然且立即发生。

示例 1:

输入:mainTank = 5, additionalTank = 10
输出:60
解释:
在用掉 5 升燃料后,主油箱中燃料还剩下 (5 - 5 + 1) = 1 升,行驶距离为 50km 。
在用掉剩下的 1 升燃料后,没有新的燃料注入到主油箱中,主油箱变为空。
总行驶距离为 60km 。

示例 2:

输入:mainTank = 1, additionalTank = 2
输出:10
解释:
在用掉 1 升燃料后,主油箱变为空。
总行驶距离为 10km 。

提示:

1 <= mainTank, additionalTank <= 100

解题思路

难度:简单。

思路:最直观的想法是,使用distance表示可以行驶的最大距离,当主油箱油量小于5时,直接返回mainTank*10,反之当主油箱油量大于等于5时,将distance加以50,再判断副油箱油量,如果副油箱油量大于等于1,则将副油箱油量减去1,同时将主油箱油量减去5再加上1,反之当副油箱油量小于1,则将主油箱油量减去5,最后退出循环后,还需要将distance加上剩余主油箱油量乘以10。

class Solution {
public:
    int distanceTraveled(int mainTank, int additionalTank) {
        int distance=0;
        if(mainTank<5)
            return mainTank*10;
        while(mainTank>=5)
        {
            distance+=50;
            //有余量
            if(additionalTank>=1)
            {
                additionalTank-=1;
                mainTank-=4;
            }
            //无余量
            else
                mainTank-=5;
        }
        distance+=mainTank*10;
        return distance;
    }
};

总结:模拟,最主要的是注意边界条件。

2740. 找出分区值

题目描述

描述:给你一个 正 整数数组 nums 。

将 nums 分成两个数组:nums1 和 nums2 ,并满足下述条件:

数组 nums 中的每个元素都属于数组 nums1 或数组 nums2 。
两个数组都 非空 。
分区值 最小 。
分区值的计算方法是 |max(nums1) - min(nums2)| 。

其中,max(nums1) 表示数组 nums1 中的最大元素,min(nums2) 表示数组 nums2 中的最小元素。

返回表示分区值的整数。

示例 1:

输入:nums = [1,3,2,4]
输出:1
解释:可以将数组 nums 分成 nums1 = [1,2] 和 nums2 = [3,4] 。
- 数组 nums1 的最大值等于 2 。
- 数组 nums2 的最小值等于 3 。
分区值等于 |2 - 3| = 1 。
可以证明 1 是所有分区方案的最小值。

示例 2:

输入:nums = [100,1,10]
输出:9
解释:可以将数组 nums 分成 nums1 = [10] 和 nums2 = [100,1] 。 
- 数组 nums1 的最大值等于 10 。 
- 数组 nums2 的最小值等于 1 。 
分区值等于 |10 - 1| = 9 。 
可以证明 9 是所有分区方案的最小值。

提示:

2 <= nums.length <= 105
1 <= nums[i] <= 109

解题思路

难度:中等。

思路:最直观的想法是,找出差值最小的两个数。首先将数组排序,然后遍历一遍求最小差值。

class Solution {
public:
    int findValueOfPartition(vector<int>& nums) {
        //先排序
        sort(nums.begin(),nums.end());
        //再找中间两个
        int n=nums.size();
        int diff=INT_MAX;
        for(int i=n-1;i>0;i--)
        {
            diff=min(diff,nums[i]-nums[i-1]);
        }
        return diff;
    }
};

总结:有时候,题目思路很简单,但是会对题目进行很强的包装,从而产生迷惑性,故此时需要好好分析题目的本质是什么。

2741. 特别的排列

题目描述

描述:给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:

对于 0 <= i < n - 1 的下标 i ,要么 nums[i] % nums[i+1] == 0 ,要么 nums[i+1] % nums[i] == 0 。
请你返回特别排列的总数目,由于答案可能很大,请将它对 109 + 7 取余 后返回。

示例 1:

输入:nums = [2,3,6]
输出:2
解释:[3,6,2] 和 [2,6,3] 是 nums 两个特别的排列。

示例 2:

输入:nums = [1,4,3]
输出:2
解释:[3,1,4] 和 [4,1,3] 是 nums 两个特别的排列。

提示:

2 <= nums.length <= 14
1 <= nums[i] <= 109

解题思路

难度:中等。

特别的排列:最直观的想法是,状态压缩DP+记忆化搜索。由于包含n个互不相同的整数,故此时数值下标即唯一代表数值,那么我们可以只记录下标,而不用记录具体的数值。由于是全排列,故每一个元素要么为选要么为不选,对于可选的集合,我们可以将集合映射到二进制位运算中进行计算,比如0、2、3对应数值1101。全集为(1<<n)-1,总个数为(1<<n),将元素从集合中删除是left^(1<<i),判断集合中是否包含该元素则为(left>>i)&1。即从头到尾遍历数组,并将当前元素从可选集合中删除,然后统计在可选集合中且上一个数是i的可选方案,该统计方法即再次遍历数组,选择当前未被使用的且满足要求的元素。(整体思想回溯)

const int MOD=1e9+7;
int specialPerm(vector<int>& nums) 
{
   //只需要记录下标而不需要记录数字
   int n=nums.size();
   //将集合对应成二进制数字 left表示可选择的集合 初始为全集 1表示可选择
   int left=(1<<n)-1; 
   //1<<n表示一共0~(1<<n)-1个大小的数组 第一维度代表的是数字组合 第二维度代表的是当前元素下标
   int memo[1<<n][n];
   //记忆化搜索 -1代表未记录过
   memset(memo,-1,sizeof(memo));
   //返回值是int类型 两个参数是int类型
   function<int(int,int)> dfs=[&](int left,int i)->int
   {
      //递归出口 没有元素可选 即枚举完了 该排列符合
      if(left==0)
        return 1;
      //有记录则直接返回
      if(memo[left][i]!=-1)
        return memo[left][i];
      int ans=0;
      //枚举数组下标
      for(int j=0;j<n;j++)
      {
         //(left>>j)&1判断当前位是否是1 即枚举该下标是否用过
         if(((left>>j)&1)&&(nums[j]%nums[i]==0||nums[i]%nums[j]==0))
         //在left中删除j并继续计算后续
         ans=(ans+dfs(left^(1<<j),j))%MOD;
      }
      memo[left][i]=ans;
      return ans;
    };
    int res=0;
    for(int i=0;i<n;i++)
      res=(res+dfs(left^(1<<i),i))%MOD;
    return res;
}

总结:注意,一般对于集合的元素选择,均可以转换为二进制位运算。文章来源地址https://www.toymoban.com/news/detail-490808.html

到了这里,关于【力扣周赛】第350场周赛的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣周赛】第 113 场双周赛(贪心&异或性质&换根DP)

    https://leetcode.cn/contest/biweekly-contest-113/ https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array/ 提示: 1 = nums.length = 100 1 = nums[i] = 100 nums 中的整数互不相同。 因为数据范围很小,所以可以从小到大枚举可能的答案。 https://leetcode.cn/problems/minimum-array-length-after-pair-removals/ 提示: 1

    2024年02月07日
    浏览(33)
  • 力扣第357场周赛补题

    6925. 故障键盘 - 力扣(LeetCode) 思路:模拟 6953. 判断是否能拆分数组 - 力扣(LeetCode) 思路:脑筋急转弯 2812. 找出最安全路径 - 力扣(LeetCode) 思路:多源bfs+倒序枚举+并查集

    2024年02月14日
    浏览(38)
  • 【算法】力扣第 284 场周赛(最短代码)

    看数据范围 1 = nums.length = 1000 ,直接暴力 2行 搞定 看数据范围 1 = n = 1000 ,每个工件最多只覆盖4个单元格,直接哈希+暴力, 2行搞定 这题比较吃细节,推荐大家看一下灵茶山艾府大佬的题解, 1行 就搞定了 三次dijkstra,可可也是看了题解之后才做出来, 15行 解法👇 T4罚坐一

    2024年02月13日
    浏览(47)
  • 【LeetCode周赛】LeetCode第370场周赛

    一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 = i, j = n - 1 且 i != j 的所有 i, j :如果 grid[i][j] == 1,那么 i 队比 j 队 强 ;否则,j 队比 i 队 强 。 在这场比赛中,如果不存在某支强于 a 队的队伍,则认为

    2024年02月05日
    浏览(52)
  • 【LeetCode周赛】LeetCode第358场周赛

    给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数,且这两个数数位上最大的数字相等。 返回最大和,如果不存在满足题意的数字对,返回 -1 。 示例 1: 输入:nums = [51,71,17,24,42] 输出:88 解释: i = 1 和 j = 2 ,nums[i] 和 nums[j] 数位上最大的数字相等,且这

    2024年02月12日
    浏览(44)
  • 【LeetCode周赛】LeetCode第359场周赛

    给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的首字母缩略词。例如,“ab” 可以由 [“apple”, “banana”] 形成,但是无法从 [“bear”, “aardvark”

    2024年02月10日
    浏览(42)
  • [LeetCode周赛复盘] 第 348场周赛20230604

    这场可惜了。 T1 模拟。 T2 模拟。 T3 倒序计算。 T4 同时限制上下界的数位DP。 6462. 最小化字符串长度 1. 题目描述 2. 思路分析 题意仔细想一下就会发现,其实会将每个字符仅留1个。 3. 代码实现 6424. 半有序排列 1. 题目描述 2. 思路分析 由于只能相邻交换来移动,因此每次只能

    2024年02月08日
    浏览(41)
  • [LeetCode周赛复盘] 第 359 场周赛20230820

    T1 模拟。 T2 数学贪心。 T3 dp。 T4 分组+滑窗。 2828. 判别首字母缩略词 1. 题目描述 2. 思路分析 按题意模拟即可。 3. 代码实现 2829. k-avoiding 数组的最小总和 1. 题目描述 2. 思路分析 贪心 1~k-1中,选了1就不能选k-1;选了2就不能选k-2… 因此可以选1~k//2 剩余的从k开始向上选。 可以

    2024年02月11日
    浏览(37)
  • [LeetCode周赛复盘] 第 353 场周赛20230709

    感觉有奖品大家都来了。 T1 数学。 T2 dp。 T3 dp。 T4 差分/BIT RUPQ。 6451. 找出最大的可达成数字 1. 题目描述 2. 思路分析 为了使x num在t步内相同,需要相向而行,每步最大缩短距离是2,那么t步距离是2t。 3. 代码实现 6899. 达到末尾下标所需的最大跳跃次数 1. 题目描述 2. 思路分

    2024年02月15日
    浏览(34)
  • 【蓝桥杯集训·周赛】AcWing 第94场周赛

    4870. 装物品 已知,每个背包最多可以装 5 件物品。 请你计算, 要装下 x 件物品最少需要多少个背包 。 输入格式 一个整数 x。 输出格式 一个整数,表示所需背包的最少数量。 数据范围 所有测试点满足 1≤x≤10 6 。 输入样例1 : 输出样例1 : 输入样例2 : 输出样例2 : 我的

    2023年04月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包