1449: [JSOI2009]球队收益 和 2597: [Wc2007]剪刀石头布

来源:互联网 发布:log4j不打印sql语句 编辑:程序博客网 时间:2024/05/22 08:19

之所以要把两道放在一起写是因为这两道题之间有些共同点……先从简单一些的说起:


1449: [JSOI2009]球队收益

题意:

有N支球队,有些球队之间已经打了一些比赛了,现给出每个球队的数据win,lose,C和D,分别表示已胜场数、已负场数,以及计算收益的两个系数。一支球队的收益为C*w^2+D*l^2,其中w和l是最后胜负的场数。接下来还有M场比赛。给出接下来M场比赛的对阵情况,求出N支球队收益和的最小值。接下来M场比赛的胜负是你可以决定的。N<=5000,M<=1000(其实数据范围意义不大……)。

分析:

应该可以想到是费用流模型,关键在于建模。

一场比赛必然有一个赢家和一个输家,但是似乎不太好同时在模型中表示。不妨先假设后面的M场比赛中双方都是输家,这样我们只要在模型中表示一方成为赢家即可。

至此应该有一个初步的模型了:对于N支球队和M场比赛各建一个点,从源向每场比赛连流量1费用0的边,从比赛向参与这场比赛的两支队伍各连一条流量1费用0的边。剩下的就是队伍收益的费用表示了。

我们考虑费用的增量:多赢一场比赛产生的收益。即(C*(w+1)^2+D*(l-1)^2)-(C*w^2+D*l^2)=2w*C-2l*D+C+D。对于第i支队伍,假设后M场中i参加的有x场,那么最初w=win,l=lose+x,之后每赢一场w++,l--。我们从第i支队伍的点向汇连x条边,分别代表第i支队伍赢了j场比赛时相对赢j-1场时收益的增量。由于增量一定越来越大(平方嘛),所以流量最先流过的一定是费用较小的边,即j最小的边。

至此模型完成,答案即所有队伍最初收益+最小费用最大流的费用。


2597: [Wc2007]剪刀石头布

题意:

有N个人,两两之间进行一次比赛。有些比赛已经进行了,有些还没有。我们用一个基图为完全图的有向图(感觉这货不叫有向完全图……)来表示输赢情况,一场比赛的有向边从输家连向赢家。你可以决定尚未进行的比赛的输赢情况,使得下面这种三元组的数量最多:(a,b,c)表示一个无序三元组((a,b,c)的任意排列都算同一种),其中存在有向边a->b,b->c,c->a。需要输出方案。N<=100。

分析:

有种即视感?似乎和上面的题很像,但是这里的东西似乎更不好表示。不如我们先考虑,给定这样一个图,求这样的三元组的数目。

从N个点中任选3个的方案数为C(N,3),考虑怎么样的三元组是不合法的:这样的三元组的导出子图中一定有一个点的入度为2。设第i个点的入度为ind[i],那么不合法的三元组数为\sum{C(ind[i],2)}。所有合法方案为:

C(N,3)-\sum{C(ind[i],2)}=C(N,3)-1/2*\sum{ind[i]^2-ind[i]}=C(N,3)+1/2*\sum{ind[i]}-1/2*\sum{ind[i]^2}

注意\sum{ind[i]}是定值,就是C(N,2)。那么剩下的就和上面那题一模一样了吧?至于输出方案,只要看比赛的点连出的边连向了哪个点即可。

原创粉丝点击