UVALive 7147 World Cup ——思维题

来源:互联网 发布:网易数据库51.3g下载 编辑:程序博客网 时间:2024/06/07 05:17

In normal football games, the winner team gets 3 points, loser team gets 0 point, and if there is a drawgame, both of the teams get 1 point.In World Cup 1994, Group D there is an interest thing happened. There are 4 teams in that group,Argentina, Nigeria, Bulgaria and Greece. Greece lost all the 3 matehes and scored 0. Argentina defeatedNigeria, Nigeria defeated Bulgaria and Bulgaria defeat Argentina. Since there are only 2 teams couldadvance to the next stage, one of the 3 teams will be eliminated. It’s really a surprise that a teamscored 6 will be eliminated in a 4 advance 2 group competition. That is really interesting and we’d liketo dig it deeper.In this problem, there are N teams in a group. Within a group, any two teams will play each otherexactly once, so each team will have N − 1 matches in total.In a match, the winner team will get A points and the loser team gets C points. If the match endswith a draw, each of the teams gets B points. When all matches finished, the teams will be ranked bytheir score (in case of multiple teams get the same score, they will be ordered randomly), and the topM teams from the group can advance to the next stage.Our questions are: What is the maximum possible score that a team can earn and still not advance?(Note that there may be other teams in the same group that also earn that same score and do advance.)Similarly, what is the minimum possible score that a team can earn and still advance?

题意:n支球队进行n(n-1)/2轮比赛,规定胜利的队得A分,失败的队得B分,平局各得C分,最终总分前m名可以进入总决赛,问

1、求最大的得分max,使得存在一只总分为max的队伍,该队伍没有晋级

2、求最小的得分min,使得存在一只总分为min的队伍,该队伍晋级

思路:

(若A比C小的话先交换A和C)

1.将n个队伍划分成m+1个队伍和n-m-1个队伍,设m+1个队伍的集合为X,n-m-1个队伍的集合为Y,则结果应该为集合X中最小的元素的值(排名为m+1的元素的值),为了让这个值尽量大,我们首先应该另X尽量大,即Y对X的贡献应该尽量大,这里直接给出结论:X中的所有元素都能战胜(或平局)Y中的所有元素时,Y对X的贡献最大,X中每一个元素接受Y中所有元素的贡献(n-m-1)*max(A,B),Y的作用就到此为止了。

现在X中每一个元素的基础值都为(n-m-1)*max(A,B),这是Y的贡献,下面来计算X集合内部比较产生的得分。我们要令X中最小的元素xm最大,这里再次直接给出结论:将X中的得分尽量平均分配时xm最大,这里的平均分配指的是xi与X的剩余元素比较时尽量输一把赢一把,输赢均等,所以对xm,我们在X剩余的m个元素中寻求一个均匀贡献,若m为偶数,那么结果是【m/2的赢(A)加m/2的输(C)】与【m次平局(B)】的最大值。若m是奇数,那么对于m-1和进行前面偶数情况的求解,对剩余的一个一定按照输(C)来处理,因为这个如果赢了xm就不是最小的了,最终把以上两部分相加就可以得到结果

2情况类似于1,请自行推理

#include <cstdio>#include <algorithm>using namespace std;int main() {    int T; scanf("%d", &T);    for (int kase = 1; kase <= T; kase++) {        long long n, m, a, b, c;        scanf("%lld %lld %lld %lld %lld", &n, &m, &a, &b, &c);        printf("Case #%d: %lld %lld\n", kase, (n-m-1)*max(a,b)+max(m/2*a+m/2*c,m/2*b+m/2*b)+((m%2)?max(b,c):0),               (m-1)*min(b,c)+min((n-m)/2*a+(n-m)/2*c,(n-m)/2*b+(n-m)/2*b)+(((n-m)%2)?min(a,b):0));    }    return 0;}



原创粉丝点击