牛客小白月赛19题解

传送门:https://ac.nowcoder.com/acm/contest/2272#question

我的第一篇博客。。之前都是自己在电脑上写总结.

emm,比赛的时候只做出四道,后来发现其实还有2.3道都是很水的题。。哎,太久没刷题,思路都不够快了。今天爆肝补完只剩一道了。.

A:水题 

题意:给你n个数,每个数取值在[1,1000],这n个数都严格递增。问你最多能去掉多少个数,使得删掉之后依旧能推出每个删掉的数. 例如: 1 2 3 4 5 ,那么可以删除2 3 4.输出3.

思路;观察到数据范围很小,n^2枚举所有起始点,看从这个点开始能往后拓展多少个数.要求当前区间的第一个数之前那个数要比第一个数小1且最后一个数要比它后一个数小1才能符合题意.

注意一下边界条件,可以在a[0] = 0 ,a[1001] = 1001 ,这样之后就不用特判边界了。

B:棋盘dp模板题.

跟机器人走格子一样,求方案数,加了墙壁这个条件,注意边界条件,在起始点dp初始化为1.

C:二维前缀和模板题.

题意:问你一个01矩阵中有多少个完整的k*k大小的全0矩阵.

思路:枚举所有点,以这个为矩阵左上角,查询所占的矩阵前缀和的值,为0合法/其他都不合法.

D:思维题

做了这题感觉智商被侮辱了。

题意:给你n个奇数,询问这n个奇数是否是质数。但是给出的数据是上次的答案异或上原本的值。问的是原始值是否是质数.只要输出n-1行,最后一行不用算.

思路:

当时拿Miller_Robin+快读板子往上怼。。一顿tle。想着是不是推理题。。然后打断了这个想法,最后真就是推理题,瞬间智商被侮辱了.

首先,他保证了给出来的数一定是奇数,所以如果遇到了一个偶数,那么我们可以断定,上一次的答案是1,即上一个是质数.

如果处理后的数是奇数,那么上一次答案是0,即上一个不是质数.所以就是用后一个去推断上一个的答案,又只要我们求n-1个值,正好.主要是用到了 奇数^1 = 偶数. 奇数^0 = 奇数.

    现在回想一下感觉挺显然的。。。

E:水题

给你一个图,一个定义,让你求边的个数.

思路:找规律,发现答案就是给出的图所有点的度xi =>  ∑[(xi)*(xi-1)/2].

F:字符串

题意:给你一个字符串str,问你最长的前后缀公共子串,并且这个子串要除掉前后缀之外还有在余下的子串中找到.

思路:

当时看到这个题,直觉就是正反求一遍next数组,然后枚举每个子串前后缀next,O(n)的复杂度,但是无法证明其正确性,就没动笔了,没想到真是这么做.

做法2:暴力hash.

求出字符串的hash值,从小到大/从大到小,当 前后缀 相等时,在余下的子串中用string的find函数找一下就ok,

plus:这题数据有问题,没有全a数据,没有大量的数据。。。这都能过。说实话这次挺多题有锅的。。

G:暴力

大致题意:

给你n个石头,每个石头可选可不选,两个属性a,b。问你怎么选价值最大.

思路:

观察到n很小,2^15搞一下就好.


H题:贪心


牛客小白月赛19题解_第1张图片

思路:很显然的贪心。

过程如下:

用两个数组存 撞完后1.回复稳定性的2.损失稳定性的。

对于1部分的石头排序,显然a小的排前面.

对于2部分的石头排序,b大的排前面.

证明:  ①证1部分

设当前稳定性为x,两块石头属性为 (a,b) 与 (c,d);且假设a>c;(a

那么就只有三种情况:x>a>c. 因为都是增,且x最大,那么无所谓谁排在前面.

                              a>x>c,那么只能先撞小的c才有可能撞完

                              a>c>x:无解.

所以,先撞值小的更好.

证明2部分:先讨论情况1:x > a > c

①假设先撞a

x - a + b >= c  等式成立才能撞完两个 -》 x >= a + c - b

假设先撞c

x - c + d >= a  等式成立才能撞完两个 -> x >= a + c - d

对比两式:选max(b,d)能使得等式成立的可能性最大.

然后a > x > c 或者 a > c > x这两种情况都无法撞完.

最后,如果a = c ,对于增,要么可以要么不行,选什么结果一样,对于减的,情况与上面类似.

证明如果有问题欢迎指出,或者有更简单的证明~

I -   11.25更新 

又是一道很水的题,个人认为通过率那么低是因为题目意思和题解意思都不符合,不写了。写个p.

J - 之前补完了,明天写

这道题还是挺有意义的 .

题意:给你一个一维的扫雷的状态字符串,

0代表本位没有雷,左右也没有雷.1代表本位没有雷,左右其中有一个雷.2代表本位没有雷,左右有两个雷

*代表本位有个雷,左右两边未知.?代表未知的状态.求方案数

思路:

当时写的时候是在是想的太复杂了,分了0 1 2 * 这几个情况组合去转移。蠢了。

我们可以观察到?????这种全?的情况就是2^n.那么也就是说,本质上就是每个位置上有雷还是没有雷.

dp[n][2]即可。dp的过程中对012?加以区分就好了.

对于0,那么连续三个状态已经确定,都是000

对于1,那么就只有 001 100 这两种情况

对于2那么就只有一种情况. 101

对于*,那么只能确定当前位置的状态:1

分情况转移即可。挺正常的一道dp题,没写出来是太可惜了.

?  --前面两个位置的状态唯一确定这个位置的状态.(1 2 0 ?)

0  

1 ---- 后面是 1  0 ?

2

你可能感兴趣的:(字符串,j2ee,lighttpd,动态规划,instance)