2021年济南站icpc(2-SAT未补)

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

导语

问就是后悔,说不定能拿银,至少能铜的,矩阵那个题,欲哭无泪,以后得算一下样例再看

涉及的知识点

搜索,组合数学,二维前缀和,dp,计算几何,2-SAT

链接:The 2021 ICPC Asia Jinan Regional Contest

题目

C

题目大意:有 n 件物品,第 i 件的价值为 a[i]。A 和 B 轮流取物品,A 先手。每个玩家都要最大化自己取到的物品的价值和,求有多少种可能的游戏过程。

思路:对于这道题目,需要从两个方面来分开考虑:在忽略下标的情况下,能够组成多少种合法的数字选取序列在获得了所有的合法序列的前提下,考虑下标,最后一共有多少种方案

对于第一个方面:因为需要得到最大和,那么每次去探讨当前的最大值即可,分成下面两种情况来考虑

  1. 最大值的个数为奇数
    那么当前回合的玩家必然会拿走一个最大值,剩下的就是偶数个最大值,另一个玩家可以有别的选择
  2. 最大值的个数为偶数
    如果当前玩家选了最大值,那么另一个玩家下一回合必然也会选择一个最大值

由这两种情况可以得出,任意偶数个数的数值在排列中必然是有两个连续的,举个例子,如 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 Cnkk种,对于奇数个数的数值,假设该数值为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 Cnk1k

那么,根据排列组合的规律,设当前数值出现的个数为 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=1nCnj=1i1ai(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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值