- 博客(29)
- 收藏
- 关注
原创 NC50528 滑动窗口
题意牛客网给一个长度为N的数组,一个长为K的滑动窗体从最左端移至最右端,你只能看到窗口中的K个数,找出窗口中的最大值和最小值,然后将窗口往后移动一位。思路找最大值和找最小值是一样的方法,这里以找最大值为例。每次窗口向右移动时,如果进来了一个比上一个值要大的数,则上一个值从此以后绝不可能成为窗口中的最大值,也就是说,当窗口的右端点从a[i]a[i]a[i]移动到a[i+1]a[i+1]a[i+1]时,如果a[i+1]>a[i]a[i+1] > a[i]a[i+1]>a[i],那么a
2021-02-17 11:37:34
167
原创 NC16430 蚯蚓
题意牛客网[c][c][c]表示对ccc向下取整第0秒,你有nnn只蚯蚓,第iii只蚯蚓的长度为aia_{i}ai(长度均为非负整数,可以为0)。每过一秒找出最长的蚯蚓切成两条长度为[px][px][px]和x−[px]x-[px]x−[px]的蚯蚓,ppp为0到1之间的有理数,同时其余的所有蚯蚓长度增加qqq(非负整常数)。问mmm秒内每一秒被切断的蚯蚓被切断前的长度和mmm秒后所有蚯蚓的长度思路每秒都要找最长的蚯蚓切成两条,因为新增了蚯蚓,所以我们直接对数组进行这样的操作会浪费大量的时
2021-02-16 21:27:09
121
原创 NC14301 K-th Number
题意牛客网在长度为NNN的数组A中,找出所有子区间中第KKK大的数放入数组B,求数组B中第MMM大的数1≤N≤1051\leq N\leq 10^51≤N≤1051≤K≤N1\leq K\leq N1≤K≤N1≤Ai≤1091\leq A_{i}\leq 10^91≤Ai≤109思路一看这题,对于放入数组B的数有明确的规定,那很显然我们能简单的模拟来实现这个目的,但是这么干的话运算量绝对是爆炸多的,所以我们可以考虑二分+检验来找出解二分这个步骤很简单就不说了,难点在检验我们记数组B中第M
2021-02-07 19:41:25
134
原创 NC16564 借教室
题意牛客网有nnn天借教室信息,其中第iii天学校可以借出rir_{i}ri个教室。有mmm份订单,每份订单由dj、sj、tjd_{j}、s_{j}、t_{j}dj、sj、tj组成,表示租借者需要从第sjs_{j}sj天到第tjt_{j}tj天(闭区间)内每天向学校借djd_{j}dj个教室只需要考虑每天教室的数量能否满足当天订单,按照订单先后顺序借出教室,找到第一个无法被完成的订单(第sjs_{j}sj天到第tjt_{j}tj天至少有一天学校可借出教室数量少于djd_{j}dj
2021-02-07 10:25:04
118
原创 NC19916 CQOI2021 扑克牌
题意牛客网你有nnn种牌,第iii种牌的数量为cic_{i}ci,除此之外还有一种特殊的jokerjokerjoker牌,他的数量为mmm。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌,请问最多能组成多少套牌思路看到这个题目我有一种俄罗斯方块的感觉,用joker或者原本的格子把一行填满,就组成了一套牌。但它有一条特殊的规则:一套牌中,joker最多只能代替一种牌出现例如:虽然有999张joker足以填满所有格子,但因为一套牌中,joker
2021-02-06 22:53:27
190
1
原创 NC107382 POJ2785 4 Values whose Sum is 0
题意牛客网给定n行4列的整数,从每一列各选择一个数加起来等于0的组合有多少种?思路这题很容易让人想到枚举,要让四个数字的和等于0,从前三列选择了三个数以后第四列要找的数就是确定的,可以不断地枚举找到答案,但这样时间复杂度为O(n4)O(n^4)O(n4),这可不是我们负担的起的。所以在枚举的基础上可以加入二分,确定了前三列的数字以后,对第四列进行排序,之后再从第四列种二分查找判断有多少个我们要找的数即可。但即使是这样,我们对四列数据的枚举仍会带来大量重复的计算,所以我们可以对第一、二列的数据两两
2021-02-06 21:00:31
143
原创 NC107701 POJ3104 Drying
题意牛客网Jane有nnn件带水没干衣服,每件带aia_{i}ai单位的水,自然状态下每分钟每件衣服会干掉一单位的水,为了让衣服更快的干掉,Jane决定使用吹风机吹衣服。Jane每分钟都可以选择其中一件衣服对其使用吹风机,在吹风机和自然环境的共同作用下,一件衣服每分钟可以干掉kkk单位的水,问让衣服全部干掉最少需要多少分钟。思路二分+检验对于这nnn件衣服,我们记不用吹风机的情况下自然干需要maxAmaxAmaxA分钟,很容易想到我们可以直接从111到maxAmaxAmaxA枚举,判断每种情况能
2021-02-06 20:08:26
106
原创 2021牛客寒假算法基础集训营1 | 括号
题意牛客网构造一个非空括号字符串,要求正好包含k个合法括号对且字符串长度不能超过十万* 0≤k≤1090\leq k \leq 10^90≤k≤109思路看到这个k的数据范围和字符串长度要求,我们知道不能一个劲怼括号,否则会超出长度限制那么我们先来思考一个问题:一个长度为n的字符串,如何出现最多的括号对?(为了方便描述,我假定n为偶数)答案是把字符串一分为二,左边全是左括号,右边全是右括号,这样我们就得到了(n2)2(\frac{n}{2})^2(2n)2个括号对。把上面这个过程反
2021-02-02 09:38:09
165
原创 NC207028 第k小数
题目牛客网给你一个长度为n的序列,求序列中第k小数的多少。输入描述: 多组输入,第一行读入一个整数T表示有T组数据。 每组数据占两行,第一行为两个整数n,k,表示数列长度和k。第二行为n个用空格隔开的整数。输出描述: 对于每组数据,输出它的第k小数是多少。 每组数据之间用空格隔开思路求第k小的数,第一时间就能想到和排序有关,但这个数据量用冒泡排序什么的肯定会很糟糕,所以用到了快速排序在快速排序时,我们先选取一个基准值,然后把数组中所有比基准值小的数放到基准值左边,比基准值大的数放
2021-02-02 09:37:53
460
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 | Seek the Joker I
题意题目_牛客网威佐夫博弈_百度百科传送门每次芳乃先抽,在双方都做出最佳决策的情况下判断谁必胜思路拿到最后一张牌的人就输了,所以为了获胜,我们必须拿走倒数第二张牌。拿走倒数第二张牌以后,整个牌堆剩余(n-1)张牌。每次每人只能抽取1~k张牌,所以先手抽完以后后手可以保证该回合抽的牌数为1+k(先手拿1张则后手拿k张,确保1+k)。既然后手可以保证拿1+k张牌,那我们只需判断(n-1)是否能被k+1整除即可,如果能被k+1整除,说明后手拿走了倒数第二张牌,后手必胜代码#include <
2021-02-01 10:34:43
105
原创 NC16438 回文日期
题目牛客网思路题目要求统计回文日期,相当于回文字符串,可以考虑使用遍历如果固定年份,对月和日进行遍历再判断是否回文效率太低,可以直接遍历月和日,根据月和日构造回文的日期,这样最多只有366种可能。列出所有的回文日期以后再判断是否再输入的区间之内即可代码#include<iostream>using namespace std;int main() { short days[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31,
2021-02-01 10:16:59
132
原创 NC16649 校门外的树
题目牛客网思路对于长度为L的马路,一开始共有L+1棵树如果直接声明长度为L+1的数组再根据输入的区间一个一个遍历把树移走的话,一个区间有n个数就要执行n次操作,太过复杂,耗费时间比较长,数据小还可以操作,数据大的话就不行了,所以这题可以考虑差分和前缀和有L+1棵树,为了方便操作,在数组最前面和最后面再加两个数,所以这里声明L+3长度的数组。数组的每个元素代表数轴上这个点比上一个点多了多少棵树,数组第一个元素为1,即一开始所有点上都有树。只需要把区间左端点处的树自减,右端点后一个点处的树自增即可
2021-02-01 10:16:00
102
1
原创 NC20032 HNOI2003 激光炸弹
题目牛客网思路5001*5001,量太大了,直接用前缀和整一个5001*5001的二维数组来对应整个地图,数组中的元素表示当前坐标上目标的价值(无目标即为0)先很普通的用循环记录每个目标的坐标和价值,然后再循环计算前缀和。计算时,每个点[i][j]上记录的价值和为 [ i ][ j ]+[ i-1 ][ j ]+[ i ][ j-1 ]-[ i-1 ][ j-1 ] 因为炸弹无法破坏爆炸范围边界上的目标,所以爆炸范围为R的炸弹最多一次可以炸掉R*R个目标(画个图把范围左右移动一下就明白了),我
2021-02-01 10:14:43
146
原创 NC107658 POJ3061 Subsequence
题目牛客网思路题目要求找到长度最小的子串,使得字串和大于等于S既然是要长度最小,那我们就可以从长度为1开始遍历到长度为N,我们需要遍历∑i=1Ni\sum_{i=1}^{N}{i}∑i=1Ni次 ,当N非常大的时候耗时会特别长,所以可以稍微优化一下(双指针/尺取法)。如果是按长度从1到N遍历,那么我们每次都要从子串的头到尾重新计算一次子串和,对此我们可以做出这样的优化:按数组元素的位置遍历,从第一个元素开始,从长度为1不断修改子串的长度,直到子串和刚好大于等于S,再从第二个元素开始,继续往下
2021-02-01 10:12:54
121
原创 NC18386 字符串
题目牛客网思路这题一看就可以用暴力,没什么好说的优化一下,用双指针,用一个26个元素的数组统计各字母在子串中出现过的次数判断是否符合题意即可代码#include <iostream>#include <string>using namespace std;//用于判断是否符合题意bool isLegal(const int (&alphabet)[26]) { for (int i : alphabet) { if (i ==
2021-02-01 10:09:09
133
1
原创 NC207040 丢手绢
题目牛客网思路用双指针,从第一个小朋友开始一圈圈按顺时针方向遍历,到最后一个小朋友的那圈遍历完结束。因为题目定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离,所以在计算最远距离时要让当前两个小朋友的距离小于圆圈周长的二分之一,不然最短距离就会变成从逆时针方向开始计算,这是一个小坑同时,计算的时候数组里第i个元素储存的是第(i+1)个小朋友到第(i+2)个小朋友的距离,所以代码23-25行是先+= distances[end]再让end指向下一个人,也是一个小坑代码#include
2021-02-01 10:05:21
171
原创 NC20241 SCOI2005 扫雷MINE
文中数组下标均从0开始题目牛客网思路地图上有两列,mine对应第一列,表示格子里的地雷数(0或1),map对应第二列,表示附近的地雷数根据map[0]的值,我们可以推断mine[0]和mine[1]地雷的存在情况,如:下标minemap0121122?23?14?1然后依据扫雷游戏的规则,我们有公式: map[i] = mine[i-1] + mine[i] + mine[.
2021-02-01 10:02:32
240
原创 NC106350 POJ1753 Flip Game
题意:牛客网在4*4的棋盘里有16个可黑可白的棋,每轮游戏可以选择将一个棋及其上下左右相邻的棋的颜色取反(最多五个最少三个),所有棋面颜色相同时游戏结束,求最少进行几轮游戏后游戏结束思路:对任意的一个棋子进行两次翻转操作是无意义的,负负得正,因此一个棋最多只翻一次,可以采取枚举我们从上至下(当然你也可以换个方向),一行一行的将棋子翻到相同的颜色(比如说我们现在要把它们全部翻成白色),我们记0为黑,1为白。假如前两行的棋子是0101,1111,那么为了让第一行的棋子全都变成1,我们需要对第二行第一
2021-02-01 10:01:01
118
原创 NC16783 拼数
题目牛客网容易跳坑的错误思路:将整数按字典序排序,比如把7,13,4,246排序成7,4,246,13,这样乍一看是对的,但多尝试几组数据以后可以发现会有类似98,9或者321,32这样的数据没法得到正确答案。正确的贪心思路:*假设数字均以字符串储存对于数字a, b, c, d,我们任意改变其中两个相邻数字的顺序,不会对余下的数字造成影响。比如对1, 2, 3, 4, 5中的3和4改变顺序,整数变成12435,其3和4前后的1、2和5并不会受到影响。所以我们可以把两个相邻的数字(其实不相邻也可
2021-02-01 09:59:54
143
原创 NC16561 国王的游戏
题目牛客网思路首先我们清楚,交换任意两个相邻大臣的位置,对其他大臣获得的金币数不会造成影响。题目要求使得获得奖赏最多的大臣,所获奖赏尽可能的少,也就是让最大值尽可能小,并且国王固定在队伍的最前面,所以我们考虑后面的大臣即可。在n(n≥2)个大臣中找出任意相邻的两个大臣A与B,记他们左右手的值分别为aLa_{L}aL 、aRa_{R}aR 、bLb_{L}bL、bRb_{R}bR ,以及在A之前的所有大臣和国王左手上数字的乘积为preprepre前乘积ABpreprep
2021-01-31 20:19:47
215
2
原创 NC25043 Protecting the Flowers
题意:牛客网有N头牛在吃花,牛i距离家有Ti分钟的路程,且每分钟能吃Di朵花,你一次只能带一头牛,请安排送牛回家的顺序,让牛吃掉的花的总数最少并输出(当你往一头牛那边走和带着牛回家的时候牛都不会吃花,虽然题目好像没说往牛那边走的时候不会吃,但是好像确实不会吃)思路:我们知道,在把牛送回家的队列中,改变任意两头相邻的牛的顺序并不会对他们前面或后面的牛吃的花的数量造成影响,所以为了让吃的花的总数最少,我们应该调整每相邻两头牛的位置,让他们俩吃的花最少,这样整个队列中的牛吃的花的数就最少我们假定队列中某
2021-01-31 20:07:29
104
原创 NC18979 毒瘤xor
题目牛客网要求∑i=LRX⊕a[i]\sum_{i=L}^{R}{X\oplus a[i]}∑i=LRX⊕a[i]最大,涉及到异或操作,很显然我们需要用位运算来处理这题思路位运算时,每一个bit可以被独立的拿出来运算,所以我们记X的第p位bit为XpX_{p}Xp ,区间里aia_{i}ai 的第p位bit为aipa_{i_{p}}aip ,看看怎么让区间里∑i=LRaip\sum_{i=L}^{R}{a_{i_{p}}}∑i=LRaip 最大,也就是让区间里第p位bit上出现1的次
2021-01-31 19:56:11
171
1
原创 NC200190 矩阵消除游戏
题目牛客网错误思路每回合选择之前,先计算每行每列的权值和,然后选最大的那一行或列。按这个思路来写,如果正好是先选了一堆行再选一堆列,或者是先选一堆列再选一堆行,那么不会出现问题。但如果是选了行,选了列,后面又开始选行了,那么答案就会出问题,因为你的选列行为对后面的选行造成了影响。(不是很好说,但能举出很多反例)这里引用一下大佬们的题解:因为你的每次选择,选一列也好选一行也好,会对后面的选择造成影响,且不同的选择造成的影响是不一样的,你这次先选了最好的一行(列)有可能就会使得后面能选的变少,你没
2021-01-31 19:43:02
146
2
原创 NC17857 起床困难综合症
题意:牛客网给定了所有的防御门运算符op和参数t,限定最大的初始攻击力为m,求经过防御门转变后最大一次能对恶龙造成多少伤害思路:为了方便描述,我们记初始伤害为xxx, 经过防御门以后的伤害为yyy。既然防御门涉及到位运算,那干脆把xxx 也表达为二进制,把问题转换成找到如何安排每一个bit的值,让yyy的值最大首先我们清楚:二进制中(如 0110 1001),越靠左的bit权值越大,其转换成十进制时对数的大小影响也越大。为了能让yyy最大,我们应尽可能让yyy中靠左的bit为1,且1的数量尽可
2021-01-31 19:39:58
88
原创 NC204383 中序序列
题意牛客网给了一颗树的前序序列和后序序列,求中序序列如果某节点只有一个子节点,将其视为左节点思路为了按照中序序列“左、根、右”的顺序输出序列,我们需要用到递归,先递归左树、输出根、再递归右树。以题目给出的示例一的树为例:由于给了前序序列,所以我们知道3是根节点,3后边的2是他左子树的根节点知道了左子树的根节点,题目又给了后序序列,所以我们可以去后序序列中找到那个左子树的根,再根据后序序列“左、右、根”的顺序确定左子树节点的个数和右子树节点的个数知道了左右子树的长度就可以确定他们在前序序列和
2021-01-31 19:32:22
232
原创 NC14731 逆序对
题意牛客网在长度为n的01串中,若第i位=1,第j位=0,i<j,则成这是一对逆序对,求所有的长度为n的01串中一共能出现多少逆序对思路一枚举逆序对出现位置的方案以n=3n=3n=3为例,逆序对可能的存在方案有:?10、1?0、10??10、1?0、10??10、1?0、10?三种方案(C32=3C_{3}^{2} = 3C32=3 ),每种方案中含一个??? 代表未知数字,这个未知数字又只能是0或1,所以共有C32×2=6C_{3}^{2} \times 2 = 6C32×2=6
2021-01-31 19:24:57
200
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 | 上进的凡凡
题目牛客网思路签到题看看就好,反正难的题咱也不会对于凡凡来说,只有非降序的数组才是nice的,如果数组长度为1,也是nice的难么我们只需要统计这个数组中的每一段非降序数组的长度即可统计了每一段的长度以后,由小学二年级知识我们知道长度为n的数组有∑i=1ni\sum_{i=1}^{n}{i}∑i=1ni 个子数组,再根据这个公式求出答案即可代码#include <iostream>using namespace std;int main() { int las
2021-01-31 19:10:25
110
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 | 买花
题意牛客网在15天内买完n朵花,且不能一天买完,第一天买的数量任意,之后每一天买花的数量为前一天的两倍如果能刚好买到n朵花,输出YE5(注意不是YES),否则输出N0(注意不是NO)思路假设第一天买了a朵花,那么第二天只能买2a朵,第三天只能买4a朵。观察到,总共买的花的数量永远是奇数倍的a,即总共买的花的数量能被某个奇数整除,且奇数满足一定的规律((1 << day) - 1,即在二进制上每一位都是1)。因为阳阳必须在15天内买完他要的花,所以那个奇数最大只能是32767,我们
2021-01-31 19:04:29
148
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 | 小宝的幸运数组
题目思路其实我也不会,单纯解读一下别人的代码题目要求幸运子数组中所有数的和能被k整除由小学二年级数学知识我们知道:若数列中第i项ai%k=c(c为常数),aj%k=c,i<j,则有∑x=i+1jax=k×某一常数若数列中第i项a_{i}\%k=c(c为常数),a_{j} \%k=c,i<j,则有\sum _{x=i+1}^{j}{a_{x}} = k \times 某一常数若数列中第i项ai%k=c(c为常数),aj%k=c,i<j,则有∑x=i+1jax=k×某一常数
2021-01-31 18:56:15
155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人