2017.8.18 总结

来源:互联网 发布:java解析xlsx文件 编辑:程序博客网 时间:2024/06/05 00:45

今天的题….难到一种境界,有些人做了一半就咸(qi)鱼(liao)了,有些人看了题直接不写了(雾),我虽然坚持到了最后,但我……也才60分qwq…….

T1

题意:有两个人在玩石头剪刀布的游戏。游戏分每轮进行,一轮有n局游戏,每局胜者得1分,平局都不得分,分数高者赢得此轮,分数相同则此轮作废。任意时刻如果AB多赢m1轮,则A获胜;如果BA多赢m2轮,则B获胜。现在已知B每一局出石头,剪刀,布的概率,且不同的两轮中的同一局B出石头剪刀布的概率是相等的,求最优策略下A的获胜概率。

思路:一般..对于这些求期望与概率的题..我都是不抱有什么希望的,于是…通过puts("1.00000");拿到了10分,233333。

题解:因为B每轮策略相同,所以在A选择最优策略的情况下,每一轮AB的胜率及平局概率就是确定的,设他们的胜率分别为pr。因为平局对局面没有影响,所以我们修改一下轮的定义:一轮是指双方不断游戏,直到有一方赢得一轮为止的一个过程。那么新的一轮A的胜率q就是p÷(p+r)
接下来先说说20分:
20n很小,结合上面的分析我们可以暴力求出每轮的胜率q。知道了q之后,设a[i]表示AB获胜轮数差为iA的胜率,那么有a[m1]=1,a[m2]=0,注意我们是要倒推出a[0]。所以其他的有a[i]=a[i+1]q+a[i1](1q),用高斯消元求出a[0]即是答案。
再来说说另外30分:
因为双方都只要赢一轮就可以赢得游戏,所以我们只要求出赢一轮的概率q即可,这也是问题的关键所在。观察q的表达式:q=pp+r=1rp+r=11(1+pr),要让q更大,就要让pr更大。设k=prk是一个分数的形式,我们可以考虑用分数规划来求,设当前二分的值为t,那么我们只要判断ptr是否大于0就可以知道t比要求的k是偏大还是偏小了。这样我们可以定义A胜一轮得1分,B胜一轮得t分(对A来说是t分),倒着DP一遍就可以找到一个最优策略使ptr最大了。DP状态f[i][j]的含义就是表示第i局时双方胜的局数差为j时最大的ptr
然后其实满分做法就根据上面两个做法来就行了。

T2

题意:有一位神犇想在n天内刷k道题,但他刷的都是神题,一天只能想一道题或者做一道题(同一天内可以想一道和做一道),显然,一道题必须先想再做。假设神题都是一样的,然后这n天里,第i天想一道题的代价为a[i],做一道题的代价为b[i]。求花费最小的代价让神犇在这n天里刷完这k道神题。

思路:当时我的思路就是mcmf(最小费用最大流)+特判,拿了40分。最小费用最大流的做法就是考虑建立费用流模型,把第i天拆成aibi,分别表示想和写,然后源向ai连流量为1,费用为a[i]的边,aibj(满足ij)连流量为1,费用为0的边,bi向汇连流量为1,费用为b[i]的边,因为只要做k道题,加个点限制下源的流量跑最小费用流即可。

题解:如果把想题看成“(”,把写题看成“)”,则费用流每次增广其实就是加入一对“()”或“)(”,且要保证当前这个括号序列合法,即序列的前缀和si在任意位置都大于等于0。设左括号的位置是posa,右括号的位置是posb,假如选择加入“()”,那么[posa,posb)si+1,假如选择加入“)(”,那么[posb,posa)si1,且这一段减完后要0,即原来的[posb,posa)的最小值要>0。然后用线段树维护几个东西就好了,接下来留给读者一些想象空间,自己想一想改用什么方法qwq(好吧其实是作者太懒…)。

T3

题意:给你一个n,表示一共有n个点,再给你一个半矩阵,即一共n1行,第i行有ni个数,第1行表示从点12n各个点的距离,第i行表示从点i(i+1)n的各个点的距离。现在让你把n个点分为两个集合,每个集合的值val为在该集合中的所有点之间两点的距离最大,求两个最大值之和最小。

思路:当时我就打了个O(2n)的暴力,拿了10分qwq…

题解:假设我们已经枚举了D(A)D(B),我们认为D(A)是更大的那一个,这就是一个2SAT问题。枚举D(A),二分D(B),再利用单调性去掉log,可以做到O(n4)。这个解法有40分。然后,我们考虑哪些边才有可能成为A的最大边:
1.对于图中的一个偶环,其中的最短边才不可能成为A中的最大边,因为当它的两个端点都在A时,偶环上一定存在另外一条权值比他大的边,它的两个端点都在A集合。
2.对于图中的一个奇环,至少有一条边它的两个端点在同一个集合。所以奇环上的最小边会成为A最大边的下界。于是,我们将可能成为一个集合最大边的候选边集的大小缩小到了O(n)级别:把边从大到小排序,考虑加入一条新的边,如果它的两个端点不在同一个连通块,可以直接加入候选边集;如果在同一个连通块且没有形成奇环,直接忽略,如果形成奇环,将它加入候选边集并停止算法,因为这将成为一个集合最大边的下界,套用前面的算法,我们可以做到O(n3logn),就可以过了。