牛客练习赛21
A 黑妹的游戏I
- 有一个堆,堆里有三个不同的数字,每次可以选择两个不同的数字,然后计算出差值,将差值加入堆中。问,堆里最多有多少数字。
- 可以发现,假设开始时数字为a,b,c,那么堆内的数字一定能够被表示为ax+by+cz这样的形式。此数字一定是a,b,c这三个数的gcd的倍数。又因为a,b,c三个数的gcd一定能被这三个数给表示。所以能够被表示出来的数为gcd(a,b,c)~max(a,b,c)。
B 黑妹的游戏II
- 两个人轮流从n*m的棋盘中取数,从左上到右下,只能往右或者往下取,都采取最优策略,求两人的分数差。
- 很经典的dp。从dp[n][m]逐步往初始位置dp。
dp[i][j]代表我拿了这个地方的数字后能够获得的比后手多的最大值。
那么,可以发现,拿了这个位置之后,后手只能拿a[i,j+1]或者a[i+1,j],那么后手肯定挑另你这个状态最小的拿。所以dp[i][j]=a[i][j]-max(dp[i+1][j],dp[i][j+1])。
C 黑妹的游戏III
- 有一堆数字,如果两个数有公共的因子,那么他们可以同时除去这个公共因子。最后,把所有的数相乘,要求乘积最小。
- 提供一组数据"10,10,4"。最后结果为"1"。
- 对每个因子考虑所有的数,总不可能是两个低次幂的数约掉,而留着高次幂的,例如上面的不会将10和10中的2约掉,而是分别和4约。
- 那么,我们就能用贪心的做法,先将最高次幂的两个数约掉一个因子,然后在取最高次幂的两个数,迭代下去。这里可以通过优先队列实现。
- 然后,我们可以发现,这里的数是10^8。也就是说,除了10^4以内的质数外,其他的质数在每个数内至多出现一次,所以对于之外的数,直接排序约去即可。因为此时,保证不会有数内相约的情况出现。
E 黑妹的游戏V
- 有n枚棋子在二维平面上,现在你需要将k枚棋子移动至同一个位置,求最小移动步数。
- 这道题是一维上的推广,一维平面上要将k个棋子移动到同一个位置需要的最小就是它们的中位数。
- 那么二维平面上将k枚棋子移动到同意位置,可以看作是先将所有的纵坐标移动到同一位置,再将所有的横坐标移动到同一位置。所以移动到的位置就是这k个棋子横纵坐标的中位数。
- 这里,由于这个点的横纵坐标一定是棋子的横纵坐标,所以枚举这个点坐标,找最接近的k个点即可。
F 黑妹的游戏VI
初始时给你k个整数x,黑妹需要构建一个长度为n的数组使得该数组恰好包含这k个整数,剩下的位置将由黑妹填上一些不大于100的正整数,要求数组里任意相邻的两个整数互素。
dp[i][j][k]代表前i个位置放了j个x,最后一个数字为k的方案数
- 然后状态转移一下即可。