2017ACM中国大学生程序设计竞赛哈尔滨站题解(部分)

2017ACM中国大学生程序设计竞赛哈尔滨站题解(部分)
这次现场赛六题及以上为金牌,三题靠前为银牌,三题靠后和两题靠前为铜牌。我是打模拟赛时三题靠前,赛后写出了当时没过的两题。
F Permutation
题意:给你一个序列P为1~n,让你重新组合使得P_i%|P_i-P_(i-2)|=0(3<=i<=n),输出这组序列。
题解:现场赛签到题,一道简单的思维题,按照题目给的条件,很容易想到将大小相邻的两个数间隔着放,例如:9 1 8 2 7 3 6 4 5。
H A Simple Stone Game
题意:给你n堆石子,第i堆有ai个石子,每次只能移动一个石子,问最少移动多少次使得每堆石子都是x(x>1)的倍数。(注:0是任何数的倍数)
题解:看到条件很容易想到x必须为所有石子总和的因数,又因为凑成质数的倍数比合数的倍数容易(比如凑2的倍数比凑6的倍数容易),那么枚举质因数就行了。现在有一个难点就是如何求出最少的移动次数,其实认真想想也不难,只要把所有ai%x之后的值从大到小排列,贪心拿取就行了(因为最大的相对凑到x需要的石子最少),这样就能得到所有x的最少移动次数,取个最小的就行了。有个特判就是,如果ai%x的总和不为x的倍数,那么就必须把所有石子移到一堆上才行,所以对于x答案为sum-amax。
B K-th Number
题意:给你n个数,对于所有区间,若区间长度不足k,则什么都不干,若区间长度大于等于k则将区间第k大加入到数组b,最后输出数组b中的第m大的数。
题解:一道比较难的思维题,稍微一算复杂度,暴力或者链表模拟都会超时,当时也是一筹莫展,后来想到了二分数的大小,如果有超过m个区间的第k大的数为x,那么x就能更大,反之则更小,二分+尺取法。
M Geometry Problem
题意:给你n个点,让你任意输出一个圆的圆心和半径使得有至少一半的点在圆上。
题解:计算几何题。看到点在圆上很容易想到三个不共线的点能确定一个圆。而且因为至少有一半的点在圆上,那么三个点都在目标圆上的概率为1/2*1/2*1/2=1/8。概率很大,我们可以随机抽取三个点确定一个圆判断是否有一半以上的点落在这个圆上,脸不黑到100次随机都抽不到要的结果就能过这题,不过这题特别要注意精度问题和特判n<=4的情况,不然会WA或者超时。
A Palindrome
题意:给定一个字符串,统计有多少个子串是one−and−half palindromic. (即字符串长度为3n−2,且满足S[i]=S[2n−i]=S2n+i−2
题解:对one−and−half palindromic字符串稍作分析:可以发现,这种字符串的形式是这样的: L ( S ) @ R ( S ) L(S)@ $、@分别表示某一个小写字母。

L(S)、R(S)分别表示某一个字符串,和该字符串的逆串(可为空串)。
首先,用Manacher预处理出每个字符为中心的最长回文串长度p[i]。
设子串中第二个@,第二个$ 在原串中的下标分别为i,j. 那么,该子串必然要满足:
j<=i+p[i]。然后用树状数组计数就可以了。

猜你喜欢

转载自blog.csdn.net/qq_41232072/article/details/81813823
今日推荐