牛客小白月赛59
A.我会开摆
- 题意
- 给定n=4的方阵,问是否存在n=2的方阵中四个格子全是一个字符的情况
- 题解
- 直接枚举所有点当n=2方阵的左上角,看是否符合题目要求
- 注意:检查n=2的方阵时,要先排除某点为左上角没有n=2方阵情况
- 代码
1 |
|
B.走廊的灯
- 题意
- 路上有n盏灯,0代表灭的,1代表亮的,2代表闪烁,可以看成灭的也可以看成亮的
- 问最长的状态一样的连续的灯的数量为多少
- 题解
- 暴力,分两次遍历,第一次把2全部当作0,第二次把2全部当作1,找出最长的连续段即可
- 代码
1 |
|
C.输出练习
- 题意
- 从小到大输出区间[l,r]中,k的非负整数次方的值
- l,r,k范围 [0,2^63)
- 题解
- 除去特例的0,1;当k=2时,l=0,r=2^63-1,会有最多个输出,也才64个。所以直接暴力即可
- 注意特判。k=1时,直接输出1即可,否则暴力和会炸;k=0时,0^0=1,但是
0^1
=0,0^2
=0,即如果区间符合要求,那么k=0会有两个输出。麻麻麻这里WA麻了,好无语 - 注意数据范围,while(k<=r)这样写会爆long long,所以我这里用java逃课
- 代码
1 | import java.math.BigInteger; |
D.国际象棋
题意
- 竖直放置的n*m的棋盘,每次选一列放一枚棋子,重力原因棋子落到最下面
- 对于第i个放置的棋子,i为奇数时,其所放的颜色为黑色,偶数为白色棋子
- k子连珠定义为:横竖撇捺四个方向存在某个方向有k个相同颜色棋子
- 一共放t颗棋子,若出现k子连珠则游戏结束,保证有解,问游戏结束时放置了多少棋子
题解
模拟题。
1
水平方向,竖直方向,两个斜方向分别枚举看是否符合条件即可
代码
1 |
|
E.弹珠碰撞
- 题意
- 长度为n的线段上有m个弹珠,给定每个弹珠的方向左/右,及坐标
- 弹珠每秒走一个单位,发生碰撞会停滞一秒,且两珠方向互换,多次碰撞停滞时间叠加
- 当弹珠走到0,或者n+1认为掉落
- 问线段上最后掉落的弹珠掉出所花的时间
- 题解
- 碰撞转向直接看成穿过就好了,因为弹珠之间没有区别
- 以某个向左走于位置i的弹珠为例,没有碰撞时时间为i-0,有碰撞需要记录在i左边且方向向右的弹珠数r,时间为i-0+r,从左往右边遍历遍记录答案和数量即可。某个向右走于位置i的弹珠,n+1-i+l,注意这里是逆序遍历。
- 这类题经常就是这样的写法,相当于固定题型了
- 代码
1 |
|
F.困难卷积
- 题意
- 题解
- trick题。如果我们直接暴力枚举两个数组,复杂度为O(n^2)炸了
- 观察数据范围特征,数组的和范围在1e7以内,那么考虑与种类数有关,因为贪心构造一个数种类多的数组为0 1 … x,等差数列求和得到x=sqrt(2e7),即数组中最多有sqrt(2e7)种数,此时遍历的复杂度已经降低了,所以开始考虑如何计算答案
- 以同种类数分别分组a,b后,我们可以得到数num及其出现的次数cnt。那么对于某一组别a1和某一组别b1对于答案的贡献为
(a1.cnt * b1.cnt * floor(sqrt(差))
,那么只需要枚举a分组和b分组,时间复杂度为O(sqrt(2e7)^2)=O(2e7)
- 代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xw的妙妙屋!
评论