本周的周赛题目质量不是很高,因此只给出最后两题题解(懒)。

1552 两球之间的磁力 #二分答案

题目链接

题意

n个空篮子,第i个篮子位置为position[i],现希望将m个球放到这些空篮子,使得任意两球间最小磁力最大。(其中,磁力简化为两点位置之差)

分析

该题是二分答案的裸题,详细见代码

  1. class Solution {
  2. public:
  3. bool Judge(vector<int>& a, int x, int m){
  4. int cnt = 1lastpos = a[0];
  5. for (int i = 1; i < (int)a.size(); i++){
  6. if(a[i] - lastpos >= x){ //两点间距是否大于答案x
  7. cnt++;
  8. lastpos = a[i];
  9. }
  10. if(cnt == m) return true;
  11. }
  12. return false;
  13. }
  14. int maxDistance(vector<int>& position, int m) { //该二分算法,是考虑[1, n+1)
  15. sort(position.begin(), position.end()); //记得先排序!!!
  16. int lo = 0x3f3f3f3f;
  17. int hi = position[position.size() - 1] - position[0] + 1; //确定两个篮子最大间距,为二分的上界,注意要+1!!!
  18. for (int i = 1; i < (int)position.size(); i++){
  19. int delt = position[i] - position[i - 1]; //确定两个篮子的最小间距,为二分的下界
  20. lo = min(delt, lo);
  21. }
  22. while(lo < hi){
  23. int mid = (lo + hi) >> 1;
  24. if(Judge(position, mid, m)) //估计答案
  25. lo = mid + 1; //答案可以再高一些
  26. else
  27. hi = mid; //说明该答案下的间距无法将所有球放完
  28. }
  29. return lo-1;
  30. }
  31. };

1553 吃掉N个橘子的最少天数 #记忆化搜索

题目链接

题意

给定n(<= 2e9)个橘子,每一天你只能从以下三种方案中选择一种:

  • 吃掉一个橘子
  • 若剩余橘子数n能被2整除,那么你可以吃掉n/2个橘子
  • 若剩余橘子数n能被3整除,那么你可以吃掉2*(n/3)个橘子

现要求吃掉这n个橘子的最少天数。

分析

容易知道,当n>3时,吃掉n/2个橘子,剩余橘子数即为n/2;吃掉2*(n/3)个橘子,剩余橘子树即为n/3

那我们先预处理,将n$\leq$3的情况记录下来。接下来考虑转移方程。

起初我考虑有三个转移方向:n-1n/2n/3,并用数组记忆化。在如此庞大的数据范围,不但数组无法承受,而且会分出更多的子问题。

为了应对空间问题,可以考虑用map来记忆化。

为了应对时间问题,我们分析到,对于当前剩余橘子数n

  • 方案二分析:\(n\ Mod\ 3 = 0, 1, 2\),余数为0,显然吃掉n/3个橘子即可;余数为1时,说明我们需要用n/3天的时间将3的倍数个橘子吃完,最后剩下一个橘子,需要1天;同理,余数为2时,说明我们用n/3天将3的倍数个橘子吃完后,还需要用两天时间(使用方案一)将剩下2个橘子吃完。
  • 方案三如方案二分析同理,我们要用n/2将2的倍数个橘子吃完后,还需要\(n\ Mod\ 2\)天(使用方案一,且已经预处理过)吃掉剩余的橘子。

因此,我们只需要交给程序去考虑当前的n是选择方案二更优还是方案三,自顶而下向下递归。无需再考虑n-1的方向,同时无需考虑当前的n是否被3整除/被2整除。转移方程见下方代码。

  1. class Solution {
  2. private:
  3. unordered_map<int, int> dp;
  4. public:
  5. int minDays(int n) {
  6. if(n == 1) return dp[1] = 1;
  7. else if(n == 2) return dp[2] = 2;
  8. else if(n == 3) return dp[3] = 2;
  9. else if(dp.count(n)) return dp[n];
  10. else return dp[n] = min(minDays(n / 3) + 1 + n % 3,
  11. minDays(n / 2) + 1 + n % 2);
  12. }
  13. };

在笔记本最后几点电量写完题解qaq

Leetcode 周赛#202 题解的更多相关文章

  1. LeetCode周赛#204 题解

    1566. 重复至少 K 次且长度为 M 的模式 #模拟 题目链接 题意 给定正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式. 模式 是由一个或多个值组成的子数组(连续的 ...

  2. LeetCode周赛#203 题解

    1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...

  3. Leetcode 周赛#201 题解

    1545 找出第N个二进制字符串的第K位 #分治 题目链接 题意 给定正整数\(n(\leq 20)\)与\(k\),二进制串\(S_n\)形成规则有: \(S_1 = "0"\) ...

  4. Leetcode 周赛#200 题解

    1535 找出数组游戏的赢家 #模拟+优化 题目链接 题意 给你一个由 不同 整数组成的整数数组 arr 和一个整数 k(\(1\leq k\leq1e9\)) .每回合游戏都在数组的arr[0] 和 ...

  5. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

  6. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  7. 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)

    Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...

  8. 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

    Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...

  9. 【Leetcode周赛】从contest-51开始。(一般是10个contest写一篇文章)

    Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 ...

随机推荐

  1. get方法和post方法的区别?

    get是从服务器上获取数据,post是向服务器传送数据,会新增资源或者修改已有资源,因此get一般用于查询,psot多用新增和修改: get和post在本质上来说没有多大区别,都是tcp链接,要说最大 ...

  2. printk 流程分析

    1. 概述 printk 用于在终端上打印内核想要输出的信息,平常我们较多使用的打印函数是 printf,两者名字虽然只有最后一个字母不同,且都是为了在终端上显示信息,但是它们的应用场景并不相同.pr ...

  3. 修改redo log 的大小

    alert日志中含有大量警告信息:"Thread 1 cannot allocate new log, sequence 320xx Checkpoint not complete" ...

  4. F1分数

    分类的常用指标有: accuracy:准确率 recall:召回率 precison:精确率 f1score:f1分数,是recall和precison的调和均值. 准确率什么情况下失效? 在正负样本 ...

  5. CORS与Django

    前言 在前后端分离项目中,如何解决跨域请求是一个必须要面对的问题.因为前端和后端的数据交互会被浏览器的同源策略所挟持,在很早之前我在博客园发了一篇文章,大概就说了一下如何简单粗暴的解决跨域. 其实那种 ...

  6. Jenkins(9)- 汉化 Jenkins 网站

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 下载插件 安装这两个插件,然后重启 ...

  7. C# 9.0 正式发布了(C# 9.0 on the record)

    翻译自 Mads Torgersen 2020年11月10日的博文<C# 9.0 on the record> [1],Mads Torgersen 是微软 C# 语言的首席设计师,也是微 ...

  8. 【linux】led子系统

    目录 前言 linux子系统 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都 ...

  9. 主动关闭 time-wait 2msl 处理

    先上传后面整理 /* * This routine is called by the ICMP module when it gets some * sort of error condition. ...

  10. TCP/IP协议图解

    联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报 ...