UVA1418 WonderTeam

链接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4164

题解

手动尝试一下,就发现 n 2 时,梦之队只能当第一
我们试图构造一种梦之队赢得次数最多,但是分数却很低的情况
如果让它赢一局,其它都赢零局的话,手算一下发现这样梦之队不仅不会排名靠后,而且会始终排第一
原因在于,如果其他队伍都赢0局,就意味着除了梦之队获胜的那一场,其它的比赛都是平局
这样再其它队伍得到1分的时候,梦之队也得到了1分,而么梦之队因为一开始得了3分,所以总分始终是最高的
那么就让梦之队不要打平局呗?让他赢一场,其它的都输掉,这样总分只有3分。
但是这样也不行,因为梦之队输的时候,和他比赛的那个队伍就赢了,这样就无法保证梦之队赢的次数最多了
那就让梦之队赢2局,其他的都赢1局?
这时,对于梦之队,得分为 3 × 2 + 1 × ( n 3 ) + 0 × ( n 1 ) = n + 3
对于被赢的队伍,得分为 0 + 3 + ( 2 n 4 ) = 2 n 1
对于其它的队伍,得分为 3 + ( 2 n 3 ) = 2 n
2 n > n + 3 n > 3 ,由 2 n 1 > n + 3 n > 4
也就是说当 5 n 时,直接输出 n 即可
那么当 n = 3 时,手动尝试一下,就发现梦之队只能排在第一的位置
n = 4 时,由上述构造方法得到梦之队可以排在第二得位置,而无论我增加或者减少梦之队得胜利局数,都不能得到更优得解,所以梦之队得最靠后位置是 2
综上所述

a n s = { 1 n 3 2 n = 4 n 5 n

代码

//贪心、构造
#include <cstdio>
int main()
{
    int n;
    for(scanf("%d",&n);n;scanf("%d",&n))
    {
        if(n<=3)printf("1\n");
        else if(n==4)printf("2\n");
        else printf("%d\n",n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/81168341