文章首发于我的个人博客:欢迎大佬们来逛逛
文章目录
- Taix
- Interesting drink
- Fence
- Fancy Fence
- Laptops
- Move Brackets
- Olesya and Rodion
- IQ test
- Registration system
- Vanya and Lanterns
- T-primes
- Cut Ribbon
Taix
问你 n个 1 2 3 4 中, 可以组成多少组,每组的最大不能超过4,求最少的组。
if语句模拟即可。
Interesting drink
有n个数字,给定一个target,求有多少个数字比target小。
排序,然后使用 upper_lower 查找即可,最后减去begin() ,找到的即是小于它的数字的个数。
Fence
寻找一段长度为k的窗口区域,使得这段长度之和为最大值,输出窗口的左边第一个下标位置。
直接求出其前缀和,然后枚举一遍求最大值即可。
Fancy Fence
给你一个角度,问你是否存在一个正多边形的内角为这个角度。
可以把内角转换为外角,即 180-a ,然后判断 360能否整除这个外角,如果可以则就存在。
Laptops
在n个长度的序列中,是否存在第一个值比后面的第一个值小,然后第二个值比后面的第二个值大。
直接排序即可。然后枚举一遍,找出最小的第二个值,同时判断如果第二个值比后面的第二个值大则直接输出结果.
Move Brackets
给你一些由’(’ ’)’ 组成的左右括号序列,每次可以把一个括号移动到字符串的最左边或者最右边,计算出能够使整个字符串满足括号的正则匹配的最小的次数。
我们不用每次都模拟一个把括号真正的移动,注意到左右括号次数是相同的,等于序列长度的一半,因此它移动存在一个正则匹配的情况。我们如果得到了不合法括号的情况,然后出现这种情况我们一定可以通过一次移动把这对括号变成合法的,因此**只需要统计不合法的括号对出现的次数
**即可,如何统计呢?如果出现左括号,则cnt++,右括号则 cnt—,每当cnt<0的时候就是不合法的情况。
Olesya and Rodion
是否存在一个长度为n的整数,满足其可以被t整除。
直接string构造即可,把所有的数字都变为t,则一定是合法的。需要单独对 t=10和n=1进行特判。
IQ test
找到序列中与其他数字奇偶性不同的数字。
统计奇偶数字的出现次数,同时记录第一个偶数和第一个奇数的下标位置,然后看谁多输出对应的就可以。
Registration system
如果一个字符串出现第一次,则插入序列,并且输出OK,否则把这个字符串的最后加上k(1,2,3,4,5…),然后输出这个字符串。
哈希表模拟
Vanya and Lanterns
在 [0,L] 的序列内,有一些路灯,找到路灯的最小照亮半径,使得整个序列道路全都被点亮。
贪心的策略:两个相邻的路灯,它们的照亮半径为相邻两个路灯之间距离的一半,然后取一个最大值就可以了。同时我们首先对最左边和最右边的两个路灯求他们分别对 0 和 L 这两个位置的最大值。
T-primes
判断一个数字是否是T质数: 它只能分解为三个不同的因数,如:4 = 1,2,4
它只包含三个因数,则中间的数字一定是这个目标数字的平方根,即这个数字一定是一个完全平方数,然后判断它的平方根是不是一个质数就可以了。
- 4 = 1,2,4 ;平方根为2,是质数,因此4是T质数
- 16 = 1 2 4 8 16 ;平方根为4,不是质数,因此16不是T质数。
Cut Ribbon
有一个长度为n的彩带,可以把它剪成三个不同的长度,并且每一个长度都可以无限的剪,问最多可以把这个彩带剪成多少段。
完全背包问题,并且必须装满背包的问题。
即每一个物品选择无限次,求剪满长度为 n 的彩带的方案数,则 dp[n] 就是我们的答案。
状态转移可以表示为: dp[j]=max(dp[j],dp[j-w[i]]+1)
同时需要注意必须装满背包,因此必须把dp数组初始化为 -1 ,并且在选择背包的时候,如果 dp[j-w[i]]<0 ,则说明这个背包没有装满,则跳过。