A题:
题目大意:给你n列元素,如果你能从中选出4列元素,使得从左到右的四列满足,第一列存在'v'字符,第二列存在'i'字符,第三列存在'k'字符,第四列存在'a'字符。你输出”YES“,否则你输入”NO"。
输入描述:输入n,m代表有多少行和有多少列,然后输入每一行的元素。1<=n,m<=20
(资料图片)
输出描述:输出"YES"或者“NO”描述是否存在这种选择
思路分析:首先每一列出现多少元素都是可以得到的。同时考虑贪心,我们若没有出现我们需要的字符,那么我们应该在当前位置就要选择,换句话说,就是我们需要一个元素,我们就找到这个元素下一次出现的位置,保证了从左到右的四列满足"vika"。
代码部分:
我的做法很麻烦,大家也可以直接去写暴力的做法会快很多。
B题:
题目大意:对于一个数组a,我们会将其中所有的元素都放入到b数组中,现在告知我们b数组,希望我们还原一个a数组,同时要求a数组的长度不能是b数组长度的两倍。a数组的答案有很多,输出一种即可。
输入描述:第一行n描述数组b的长度,第二行描述整个数组b的值,注意数组b中的元素满足.
输出描述:输出数组a的长度,输出数组a,注意数组a中的元素应该满足
思路分析:可以发现对于一个数组b,当还原为数组a的时候,我们只用考虑当前的的关系,对其分类讨论,可以发现当的时候,显然中间可以添加任何数字,当的时候,显然b_i前面应该有一个小于等于他的数字x,那么我们可以将和中间添加一个数字x。
代码部分:
C题:
题面描述:给你一个长度为n的数组a,描述每一个位置上放置多高的矩形,例如[5,4,3,2,1],如下图:
如果我们构造出来的整个图形对于y=x这个函数是对称的,那么我们输出“YES”,否则输出“NO”。
输入描述:第一行n代表数组的长度,第二行,代表每个位置放多高的矩形。
输出描述:存在关于y=x对称输出“YES”,否则输出“NO”。
思路分析:对于一个图形分析,我们可以分析矩形,然后对于一个矩形去求出他关于y=x翻转之后的位置,显然关于y=x翻转之后,会交换x和y坐标。然后再分析当前位置是否在原来也有,所以可以直接用while循环去找相对应的位置,对于这个问题大家可以去算一下[3,1,1]的情况,就可以搞明白了。
代码部分:
D题:
题面描述:现在有一个人想要吃n种口味的冰激凌,冰激凌需要用两种原料制作,比如使用1和2,可以注意到在这种情况下可以制造出{1,2}的冰激凌和{2,1}的冰激凌,但是对于这两个冰激凌,我们认为是同一种。同样我们也可以制造出{1,1}这种冰激凌。现在这个人需要恰好n种口味的冰激凌,问你最少需要选择多少个原料(原料数量不分种类)。
注意:这题的一个原料比如2可以和原料3或者原料1,分别组成{2,3}和{1,2}两种口味,但是如果想要组成{2,2}口味的话必须要再买一个原料2.
输入描述:输入n,表示当前恰好需要的冰激凌种类数量。
输出描述:输出我们需要购买多少种原料。
例子解释:
对于n=2的情况,我们可以购买[1,1,2]这样组合,恰好2种口味,答案为3.
思路分析:首先我们将{1,2}这种靠两种原料制造的冰激凌称之为混合冰激凌,对于{1,1}这种只靠一种原料制造的冰激凌称之为原味冰激凌,可以发现除掉原味冰激凌的情况,那么对于当前有n个原料,那么会存在种混合冰激凌,那么再考虑原味冰激凌,发现增加一个原料最多只会增加一个原味冰激凌,也就是n个原料,最多多出来n个原味冰激凌,那么我们就可以凑出来恰好的答案。同时,由于尽量多做混合冰激凌,对增加种类提升更大,所以具有单调性质,可以二分解决问题。
代码部分:
E题:
题面描述,给你一个长度为n的数组a,其中代表你每次出去开心可以获得的快乐值。现在一共有n天,你最多出去开心m次,如果你很久没有出去开心的话,那么你下次出去开心收获的快乐值就需要减去中间没开心的天数再乘上数值d。现在请问你可以获得的最大快乐值为多少。
输入描述:第一行输入n,m,d,为上述所介绍,第二行输入。a中的数值可以为负数
输出描述:输出可以获得的最大快乐值。
例子解释:
5 2 2
3 2 5 4 6
对于这个例子我们选择第一天去开心一下,得到贡献为3-1*2=1。
然后我们在第三天出去开心一下,得到贡献为5-2*2=1。
最后得到的最大快乐值为2。
思路分析:首先我们可以发现如果我们选择了最后一次出去开心的日子,那么我们实际上就确定了d要减去的快乐值,那么我们可以利用优先队列去维护每次选择的日子中提供快乐值最高的几天,当后面访问到新的点,如果提供的快乐值不如之前选择最差的那么我们一定不需要它。在遍历的过程中不断计算,更新答案即可。
代码部分:
F题:
题面描述:现在有n个怪兽,每个怪兽的生命值为,你是一名女巫(美少女),每秒你可以回复火焰魔力w点,回复寒冰魔力f点,你的魔力可以一直储存。然后你需要利用这些魔力消灭怪兽,消灭过程为,你消耗火焰或者寒冰魔力点去杀死第i个怪兽,再准确点说,你需要一击毙命怪兽。现在请你告诉美少女,她到底最少要等待多少秒才能击杀所有怪兽。
注意:消灭怪兽并不花费时间
输入描述:第一行输入w,f如同题目所述,第二行输入n,怪兽的数量,第三行输入怪兽们的血量。
输出描述:输出最少要等待多少秒。
思路分析:首先我们发现,对于时间,时间越长,肯定越可以消灭完所有的怪兽,所以存在单调性,可以考虑二分。然后思考当我们知道火焰魔力和寒冰魔力的值,我们考虑一部分全用火焰魔法解决,对于其他怪兽用寒冰魔法解决。同样的这里存在单调性,用火焰魔法解决的越多越好,那么只要计算出怪兽血量的组合,那么选择最大可以解决组合给火焰魔法解决,再分析剩下的可以不可以用寒冰魔法消灭。计算怪兽血量组合的部分代码可以使用bitset解决。
代码部分:
G题:
(最逆天的题面,我感觉昨晚看懂题目都花了我很长时间)
题面描述:现在给你一个长度为n的数组a,然后你获得一个神奇的物件,这个物件会这样计算这个数组的答案:
计算过程:1.对当前数组进行排序,如果只有一个元素就输出这个元素,退出循环。
2.删除数组中的重复元素,每个元素只保留一个。
3.当前数组长度为n,第一个数字+n,第二个数字+n-1,.....,最后一个数字+1.
4.重复这个操作。
然后有q次询问,每次询问将第a个位置的值更改成b(会对后面询问产生影响),然后你需要输入这个数组的答案。
输入描述:输入n,以及数组中的内容,输入q,a,b。
输出描述:输出修改后数组的答案。
例子解释:
思路分析:首先大家可以去看一下例子解释,已经其中的操作,可以发现对于两个相邻的值,如果他们要相等,一定得要经过他们差值的轮数,那么实际上最大的值最后变成的答案就是这个轮数加上最大值,因为最后一个值只会增加1。所以现在的问题转变为:解决在线修改值,并且重新计算排序之后的两个数之间的差值最大值。对于这个问题很好想到的是,我们删除一个元素,实际上他改变的情况没有很多,可以细想一下,也就是减少和左边的差值,和右边的差值,以及增加一个左右的差值,然后把新改的值添加,也是同理,每次我们删除和增加的数值其实很少,那么我们只要找到相应的数据结构解决问题即可,这里可以使用multiset具体操作和set是类似的,multiset内部元素有序,允许出现重复元素,添加和删除操作的都是logn,具体的操作可以看下面的代码。
代码部分(由于cf机子死掉了,我不确定我写的有没有细节问题,所以给大家放了jiangly大佬的代码,写的还是非常简介,真的是太强了)
Copyright © 2015-2022 东亚产业网版权所有 备案号:琼ICP备2022009675号-13 联系邮箱:435 227 67 @qq.com