杭电个人排位赛第三场
Problem A.Anagram
- 给定两个字母的集合,每次可以在一个字母上加一,'A'->'B','Z'->'A'这样。求最小变换,使得两个集合相等。
- 带权二分图最小匹配。
- 实际上贪心莽过。对于1集合的每个字母,都在2中找一个最近的,打标记。迭代即可。
Problem B.Bullet
- 有一个n*n的地图,上面分布有怪,每个怪都有一定的经验,如果这个地方没有怪,那么经验为0。每行或每列最多打一个怪,打完一些怪能获得的经验值为这些怪中最少的经验值。求在打尽可能多的怪的情况下,获得尽可能大的经验值。0<=经验值<=1e9。
- 二分图匹配加二分查找。
- 可以发现,对于每行每列最多打一个怪,直接就能想到二分匹配。二分经验,然后对于大于等于的怪,标记1,二分匹配即可。
Problem D.Dance
- 有一颗树,根为0,树上的每条边都有价值,树上的每条边都有最大经过次数,现在,你需要从叶子结点出发,走到根节点,走一次得到的价值为树上路径的价值和,求最大价值。
- 假算法 网络流。源点往叶子建边,根往汇点建边,次数为每条边的容量上限,价值为费用,最大费用最大流。
- 考虑贪心,我们优先选取从叶子到根最大价值的路线去走,直到某一刻,这条路径上的某条边被走完了。然后走次大的,再走第三大的,直到所有的走完为止。
- 走的过程中,可以暴力查询路径上最小的边,由于题目数据较弱,并不会超时。
- 当然,也可以用树剖。树剖完之后,查询树上路径的最小值,然后,树上路径统一减去这个最小值。
Problem E.Sequence
- 出的相当强的一道题。不过数据太弱了,很多奇怪的方法都能莽过,(包括我瞎写的树状数组)。
- 现在有一个数组是一个排列,对于位置i,如果存在位置j < i,并且Aj > Ai,那么这个位置good。现在,你需要删去一个数,使得剩下的数组good值尽可能大,删去的数要尽可能小。
- 我们考虑删去每一个数之后,good值会变化多少。首先,如果这个数之前有小的数,那么删去之后,这一位的good就少了,那么记为1。其次,我们这样子考虑,对于一个数a,如果在数a之后的数b仅仅比a大,那么把a删去之后,b的good值也消失了,所以位置a++。当然如果a之后的数不仅仅大于a,也大于别的数,那么删去a或别的数时,b仍然为good,所以不管。
- 最后,我们看哪位的值最小且数字最小即可。
Problem F.Four-tuples
- 按顺序给4个区间,l1,r1,l2,r2,l3,r3,l4,r4。按顺序从4个区间中选取数,组成(x1,x2,x3,x4)。另 x1≠x2,x2≠x3,x3≠x4,x4≠x1. 求有几种组成方式。
- 考虑容斥,总共4个条件,依次考虑,我们先将所有的区间相乘。减去x1与x2相等的状态,减去x2与x3相等的状态,减去x3与x4相等的状态,减去x4与x1相等的状态,C(4,1)总共4种。
- 再加上x1=x2,x2=x3的状态,加上x2=x3,x3=x4的状态,加上x3=x4,x4=x1的状态,加上x4=x1,x1=x2的状态,加上x1=x4,x2=x3的状态,假设x1=x2,x3=x4的状态。C(4,2)总共6种。
- 再考虑3个的情况,C(4,3)。
- 再考虑4个的情况,C(4,4)。
Problem G.Games
- A和B在博弈,n堆石子的nim博弈,A先走,现在B有个权力,他可以率先移走d堆,问能使他赢的移法的总数。
- B能赢,即他移走的堆的异或和为总的异或和。那么题目就变为,有n个数,你从中挑出至多d个,使得这些数的异或和为1。
- 考虑动态规划,dp[i][j][k],代表前i个数中,j个数的异或和为k的方案数。那么
dp[i+1][j+1][k^a[i]]+=dp[i][j][k]+dp[i][j+1][k^a[i]]
。记得用滚动数组。
Problem H.Dominoes
- 有一张n * m的地图。
- 地图上分布有1 * 2的骨牌,只有一个格子上有一个空,现在,你可以移动骨牌,骨牌不能重叠,问,最多有多少个位置可能出现空。
- bfs暴力移动就完了。