导语
问就是后悔,说不定能拿银,至少能铜的,矩阵那个题,欲哭无泪,以后得算一下样例再看
涉及的知识点
搜索,组合数学,二维前缀和,dp,计算几何,2-SAT
链接:The 2021 ICPC Asia Jinan Regional Contest
题目
C
题目大意:有 n 件物品,第 i 件的价值为 a[i]。A 和 B 轮流取物品,A 先手。每个玩家都要最大化自己取到的物品的价值和,求有多少种可能的游戏过程。
思路:对于这道题目,需要从两个方面来分开考虑:在忽略下标的情况下,能够组成多少种合法的数字选取序列,在获得了所有的合法序列的前提下,考虑下标,最后一共有多少种方案
对于第一个方面:因为需要得到最大和,那么每次去探讨当前的最大值即可,分成下面两种情况来考虑
- 最大值的个数为奇数
那么当前回合的玩家必然会拿走一个最大值,剩下的就是偶数个最大值,另一个玩家可以有别的选择 - 最大值的个数为偶数
如果当前玩家选了最大值,那么另一个玩家下一回合必然也会选择一个最大值
由这两种情况可以得出,任意偶数个数的数值在排列中必然是有两个连续的,举个例子,如 1 , 2 , 2 , 2 , 2 1,2,2,2,2 1,2,2,2,2这个序列最后分得的为 22122 22122 22122, 12222 12222 12222, 22221 22221 22221,由此可见是成对的,那么对于这些偶数个数值,求排列的问题就可以变成一对捆绑元素,插入n个空有多少种方式,显然可得 C n − k k C_{n-k}^k Cn−kk种,对于奇数个数的数值,假设该数值为x,那么该x的位置固定在一对x之前,并且是第一个出现的x,举个例子,对于序列 1 , 2 , 2 , 2 , 2 , 2 1,2,2,2,2,2 1,2,2,2,2,2,最后分得 2 , 2 , 2 , 1 , 2 , 2 2,2,2,1,2,2 2,2,2,1,2,2和 1 , 2 , 2 , 2 , 2 , 2 1,2,2,2,2,2 1,2,2,2,2,2与 2 , 2 , 2 , 2 , 2 , 1 2,2,2,2,2,1 2,2,2,2,2,1,可以得知,当去掉一个x之后,确定了剩下的偶数对的位置,那么第一个去掉的x的位置是固定的,就在第一个偶数对之前,可得方案数 C n − k − 1 k C_{n-k-1}^k Cn−k−1k
那么,根据排列组合的规律,设当前数值出现的个数为 a i a_i ai,最后可以得到所有的忽略下标的排列有 ∏ i = 1 n C n − ∑ j = 1 i − 1 a i − ( a i + 1 ) / 2 a i / 2 \prod_{i=1}^nC_{n-\sum_{j=1}^{i-1}a_i-(a_i+1)/2}^{a_i/2} ∏i=1nCn−∑j=1i−1ai−(ai+1)/2ai/2
对于第二个方面:当我们获得了有多少种排列的时候,剩下的就好做了,对于每种排列中的每种数值,将该种数值视为一个整体,其相对位置排列有 a i ! a_i! ai!种,那么最后就可以得到公式: ∏ k = 1 n a i ! ∏ i = 1 n C n − ∑ j = 1 i − 1 a i − ( a i + 1 ) / 2 a i / 2 \prod_{k=1}^n a_i! \prod_{i=1}^nC_{n-\sum_{j=1}^{i-1}a_i-(a_i+1)/2}^{a_i/2} ∏k=1nai!∏i=1nC

本文详细解析了2021年国际大学生程序设计竞赛亚洲区域赛济南站的多道算法题目,涵盖搜索、组合数学、二维前缀和、动态规划和计算几何等多个知识点。通过具体的题目分析,阐述了如何运用这些算法解决问题,并给出了相应的C++代码实现。文章还提及了2-SAT问题的解决策略。
最低0.47元/天 解锁文章
1万+





