5月3日比赛总结:前期发育良好,后期猥琐发育。这是2019年刚刚过去的浙江省ACM省赛题目 。后期看群里,7题铜9题银?只有两支师哥队伍是铜牌? 太真实了。看榜单浙江省的前几名好多都是中学生,惭愧啊。
E题
每次可以把一个数字移动到最前面去,问你最少移动多少次能够使得该序列为非递减序列。离比赛完毕还有3个小时零13分钟,我们一直在看这个题,emmm,只是单纯的看,没别的,连想都不想,是真的想不出来QAQ,我们智商不够啊。看了题解才知道什么思路: 我们每次往前移动,自然是移动小的数字,那我们从最后一个数字开始往前看有多少个已经排好的数字,那么用总的个数-已经排好的数字个数就是最终的答案了。举个例子: 1 3 5 4 6 7 2 8 我们从后面看,8 7 6 5是已经按顺序排好的,剩下1 3 4 2 未排好,那么最终的答案就是 8 - 4 = 4。
1 | #include <bits/stdc++.h> |
F题
将已给的字符串删掉其中的几个字母,签到题。
1 |
|
G题
找大于等于该数字的能被7整除但不能被4整除的最小数字。签到题
1 |
|
H题
通俗点说,如果一个数既大于他左边的数字,也大于他右边的数字那么这个数是个不好的数字。
现在让你最多删除一个数字(不删也行,可以删除任意一个数字),问最后剩下的不好的数字的个数最少是多少。队友翻译完后,想了一会,觉得删除一个数字只对他左右两边的数字产生影响,因此可以进行O(N)的遍历,看看删除哪个数更好一些。
1 |
|
I题
给你一个斐波那契数列,然后问你第a 到第b项的斐波那契数字之和是奇数还是偶数。开场我就看到这个题目,发现每三个数就是循环,但是我的思路需要a先减掉1,a可以是个非常大的数字,C++进行大数-1应该是很麻烦,所以直接用JAVA写,最后直接写了9个if AC, 赛后发现9种if可以合并。
1 | import java.io.*; |
J题
赛后好多人都补了这个题,发现考察的是优先队列和并查集,题目确实不错。说的是有n个人,m对关系,都是朋友关系,现在一个人一个人进场,如果这个人发现场内没有他的朋友,他就会不高兴,现在让你最小化不高兴的人数,同时输出最小字典序的进场顺序。注意A和B是朋友,B和C是朋友,但是A和C不一定是朋友。
开始我想的是谁的朋友多先输出谁,后来想出了这个思路不对。比如说 1和2是朋友,2和3是朋友,3和4是朋友,4和5是朋友,5还和2 3 4 是朋友,5的朋友最多,但是你不能先输出5,应该输出1 2 3 4 5这才是最小字典序。也就是说我们不应该找朋友最多的人,而是把这些关系利用并查集合并成一个一个的联通块,只有根节点是不高兴的人,后面的人都是和这个并查集里的人有关系的。最终f[i] = i的个数就是不高兴的人的个数。我们先把这些不高兴的人放进优先队列里,然后在逐渐的找和这些人是朋友的那些人,在把他们放进队列里,这样不断重复,知道队列为空。我们做的就是从一开始就是字典序,然后后面每一步都是最小字典序了。为了保证一开始是最小字典序,我们在进行并查集的合并的时候,要尽量的把序号小的人放在根节点。
1 |
|