UVALive 7417 思维

UVALive 7417
题目链接:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5159
题意:
足球赛,赢一场A分,平一场B分,输一场C分。
先给定n支队伍,规定前m支队伍可以晋级。
存在分数相同但是不能晋级的情况。
问两个值:最大的不能晋级分数,最小的晋级分数。
思路:
传说中的大分类讨论。
对于第一个答案,即取(n-m)个人中的一个人给m,则考虑在(m+1)个人中尽量平均分配分数。注意无法(m+1)个人分数相等时,第m+1个人也就是刚好不能晋级的那个人的分数讨论情况即可,详见代码。
第二答案同理~
源码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
#define LL long long
#define gmax(a,b) ((a) > (b) ? (a) : (b))
#define gmin(a,b) ((a) < (b) ? (a) : (b))
int main()
{
//    freopen("J.in", "r", stdin);
    int t;
    scanf("%d", &t);
    for(int cas = 1 ; cas <= t ; cas++){
        LL n, m, a, b, c;
        scanf("%lld%lld%lld%lld%lld", &n, &m, &a, &b, &c);
        if(a < c)
            swap(a, c);
        LL ans1, ans2;
        LL t1 = max(max(a, c), b) * (n - m - 1);
        LL t2 = b * m;
        if(a > c){
            if(m % 2 != 0)
                t2 = max(t2, (m - 1) / 2 * a + (m - 1) / 2 * c + max(b, c));
            else
                t2 = max(t2, m / 2 * a + m / 2 * c);
        }
        else{
            if(m % 2 != 0)
                t2 = max(t2, (m - 1) / 2 * c + (m - 1) / 2 * a + max(b, c));
            else
                t2 = max(t2, m / 2 * c + m / 2 * a);
        }
//        printf("t1 = %lld, t2 = %lld\n", t1, t2);
        ans1 = t1 + t2;
        LL t3, t4;
        t3 = min(min(a, c), b) * (m - 1);
        t4 = b * (n - m);
        if(a > c){
            if((n - m) % 2 != 0)
                t4 = min(t4, (n - m - 1) / 2 * a + (n - m - 1) / 2 * c + min(a, b));
            else
                t4 = min(t4, (n - m) / 2 * a + (n - m) / 2 * c);
        }
        else{
            if((n - m) % 2 != 0)
                t4 = min(t4, (n - m + 1) / 2 * c + (n - m - 1) / 2 * a + min(a, b));
            else
                t4 = min(t4, (n - m) / 2 * c + (n - m) / 2 * a);
        }
//        printf("t1 = %lld, t2 = %lld\n", t1, t2);
//        printf("t3 = %lld, t4 = %lld\n", t3, t4);
        ans2 = t3 + t4;
        printf("Case #%d: %lld %lld\n", cas, ans1, ans2);
    }
    return 0;
}

你可能感兴趣的:(UVALive 7417 思维)