比赛链接

最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了...

6192. 公因子的数目

题意:

给定 \(a\) 和 \(b\),问两者的公因子数量

数据范围:\(1\leq a,b\leq 1000\)

题解:

从 \(1\) 到 \(\min(a,b)\) 暴力枚举判断即可

答案为:\(\sum\limits_{i=1}^{min(a,b)} [a\%i==0\ and\ b\%i==0]\)

时间复杂度:\(O(min(a,b))\)

代码:

class Solution {
public:
int commonFactors(int a, int b) {
int ans = 0;
for (int i = min(a, b); i >= 1; --i)
if (a % i == 0 && b % i == 0) ans += 1;
return ans;
}
};

6193. 沙漏的最大总和

题意:

给定一个 \(n\times m\) 的矩阵 \(grid\),问其中所有的满足如下形状的元素之和最大是多少

数据范围:\(3\leq n, m\leq 150, 0\leq grid[i][j]\leq 10^6\)

题解:

如图所示,就是求任意一个形状如上图所示的,A+B+C+D+E+F+G的和最大是多少,

那么暴力模拟即可,可以枚举左上角,注意左上角必须保证 \(i+2<n\ and\ j+2<m\)

时间复杂度:\(O(n\times m)\)

代码:

class Solution {
public:
int maxSum(vector<vector<int>>& g) {
int ans = 0;
int n = g.size(), m = g[0].size();
for (int i = 0; i + 2 < n; ++i)
for (int j = 0; j + 2 < m; ++j) {
int sum = 0;
for (int a = 0; a < 3; ++a)
for (int b = 0; b < 3; ++b)
sum += g[i + a][j + b];
sum = (sum - g[i + 1][j] - g[i + 1][j + 2]);
ans = max(ans, sum);
}
return ans;
}
};

6194. 最小 XOR

题意:

给定两个数 \(num1\) 和 \(num2\),请你求出一个数 \(x\) ,满足 \(x\) 和 \(num2\) 在二进制位上的 \(1\) 数量相同,同时使得 x XOR num1 尽可能小。

数据范围:\(1\leq num1, num2\leq 10^9\)

题解:

这里令 \(cnt(a)\) 为 \(a\) 的二进制中 \(1\) 的数量

分类讨论:

  • 当 \(cnt(num1) == cnt(num2)\),此时 \(x = num1\) 即为答案
  • 当 \(cnt(num1) > cnt(num2)\),此时 \(x\) 和 \(num1\) 异或后使得答案尽可能小,即优先抹去 \(num1\) 的高位二进制 \(1\)。
  • 当 \(cnt(num1) < cnt(num2)\),此时可以将 \(num1\) 中的所有二进制位 \(1\) 全部抹去,此外再从小到大将 \(num1\) 中二进制位为 \(0\) 的对应的位置置为 \(1\),这样使得答案尽可能小,这里只需要添加 \(cnt(num2)-cnt(num1)\) 个 \(1\)

时间复杂度:\(O(bit)\),其中 \(bit\) 为 \(int\) 范围内的数二进制位的个数

代码:

class Solution {
public:
int minimizeXor(int num1, int num2) {
int c1 = 0, c2 = 0;
for (int i = 0; i < 30; ++i) {
if (num1 >> i & 1) c1 += 1;
if (num2 >> i & 1) c2 += 1;
} if (c1 == c2) return num1;
if (c1 > c2) {
int sum = 0;
for (int i = 29; i >= 0 && c2 > 0; --i)
if (num1 >> i & 1) {
c2 -= 1;
sum |= 1 << i;
}
return sum;
} else {
int sum = 0;
c2 -= c1;
for (int i = 0; i < 30 && c2 > 0; ++i)
if (!(num1 >> i & 1)) {
c2 -= 1;
sum |= 1 << i;
}
return sum + num1;
}
}
};

6195. 对字母串可执行的最大删除数

题意:

给定一个长度为 \(n\) 的字符串 \(s\),每次有两种删除操作:

  • 删除当前整个串 \(s\)
  • 当存在一个 \(i\) 使得 \(s[0:i]==s[i:2\times i]\),那么可以删除 \(s[0:i]\)

问最多可以进行多少次删除操作?

数据范围:\(1\leq n\leq 4000, s[i]\) 均为小写字母

题解:

考虑 \(dp\), \(f[i]\) 为删除 \(s[i:n]\) 的最多次数。

状态转移方程:

  • 直接删除整个串:\(f[i]=1\)
  • 当 \(s[i:i+j]==s[i+j:i+2\times j]: f[i] = \max\limits_{j=1}^{len}\{f[j]+1\}\)

时间复杂度:\(O(n^2)\),其中由字符串哈希来 \(O(1)\) 判断字符串是否相同

代码:

typedef unsigned long long ull;
const ull P = 13331;
class Solution {
public:
int deleteString(string s) {
int n = s.size();
s = " " + s; vector<ull> h(n + 1, 0);
vector<ull> p(n + 1, 1);
for (int i = 1; i <= n; ++i) {
h[i] = h[i - 1] * P + s[i];
p[i] = p[i - 1] * P;
} vector<int> f(n + 1, 0);
function<int(int)> get = [&](int id) {
if (f[id]) return f[id];
f[id] = 1; for (int len = 1; id + len * 2 - 1 <= n; ++len) {
ull a = (h[id + len - 1] - p[len] * h[id - 1]);
ull b = (h[id + len * 2 - 1] - p[len] * h[id + len - 1]);
if ((h[id + len - 1] - p[len] * h[id - 1]) == (h[id + len * 2 - 1] - p[len] * h[id + len - 1]))
f[id] = max(f[id], get(id + len) + 1);
} return f[id];
}; return get(1);
}
};

【LeetCode第 313 场周赛】忘光光的更多相关文章

  1. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  2. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  3. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  4. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  5. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  6. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  7. LeetCode 第 150 场周赛

    一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...

  8. LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)

    5452. 判断能否形成等差数列   给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...

  9. Leetcode 第136场周赛解题报告

    周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...

随机推荐

  1. 了解有哪几个C标准&了解C编译管道

    下列哪个不是C标准.参考:C语言标准 小知识:C语言标准的发展 K&R C: 1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了 ...

  2. SQL语句编写

    mybatis插入数据 下面的item.avatarUrl取出的是java实体类里面的属性,所有需要大写 插入的SQL: INSERT INTO `one` VALUES(1,"第一个&qu ...

  3. IP地址和端口号

    IP地址 IP地址:指互联网协议地址(Internet Protocol Address),俗称IP.IP地址用来给一个网络中的计算机设备做唯一的编号.加入我们吧"个人电脑"比作一 ...

  4. python获取线程返回值

    python获取线程返回值 前言 工作中的需求 将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去 由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢 我的优化思路是,将前端的 ...

  5. 用JavaScript写一个进度条

    var porpressBar = document.getElementById('progressBar') var info = document.getElementById('info') ...

  6. WTL_Freecell绿色版

    WTL_Freecell绿色版-用户手册 1.程序特点和使用环境介绍 (1).版本信息 WTL_Freecell-Release05-v1.3-20190129 (WTL空当接龙绿色版v1.3),By ...

  7. Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递

    python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...

  8. i40e网卡驱动遇到的一个问题

    最近在排查一个crash文件的时候,遇到一个堆栈,即软中断收包的时候,skb的关联的dev是null,导致oops, 然后去crash分析的时候,发现skb的dev去不是null. 从oops到cra ...

  9. CF600E Lomsat gelral (dfs序+莫队)

    题面 题解 看到网上写了很多DSU和线段树合并的题解,笔者第一次做也是用的线段树合并,但在原题赛的时候却怕线段树合并调不出来,于是就用了更好想更好调的莫队. 这里笔者就说说莫队怎么做吧. 我们可以通过 ...

  10. wsl创建证书让chrome浏览器识别

    我在wsl里面测试http2协议的时候,在wsl用openssl创建了证书, 然后我把证书放在windows证书管理后,用chrome打开发现提示这个: 虽然可以点击下面的强制 访问 但是chrome ...