1009: 湖南省第十三届大学生计算机程序设计竞赛(HNCPC2017)

题目描述:
在这里插入图片描述

题解:

要想比赛次数尽可能的多,那么就让平局尽可能多,要想让比赛次数尽可能的少,那么就让胜场尽可能多。

已知分数,要根据分数来推出进行的比赛场数就得明白分数的分配方法。

我们知道胜一场3分,负一场不要得分,平一场两边各的一分。将所有队伍得分加起来,然后找出最高得分,如果最高分大于总分的一半的话,那么这个得分最高的队伍必定不是全部平局;如果最高分不大于总分的一半的话,那么就可以有sum2\frac{sum}{2}2sum场平局。

假设所有队伍队伍得分是{5,1,2,4},最高分是5,总分是12,我们将5分拆成5个1分,而5小于6,那么这5个1就可以随意跟6中的5个1进行匹配,6中剩余的那个1还可以跟6中其他的5个1匹配一次,所以就可以有6局平局;如果所有队伍得分是{5,1,2,1},最高分是5,总分是9,那么这5个1并不能不重复的匹配,所以必定有胜场存在。

我们模拟胜场次数从少到多,总场次为胜场数和平局数,每次记录最大场数和最小场数即可。

int n;
int a[30];
inline void solve()
{
    priority_queue<int> heap;//优先队列,每次取出最高分
    int sum = 0;
    for (int i = 1; i <= n; i ++ )
    {
        cin >> a[i];
        sum += a[i];
        heap.push(a[i]);
    }
    int mn = inf, mx = 0, win = 0;//win记录胜场次数
    while (1)
    {
        int t = heap.top(); heap.pop();
        if (t * 2 <= sum && sum % 2 == 0)
        {
            mx = max(mx, win + sum / 2);
            mn = min(mn, win + sum / 2);
        }
        if (t < 3) break;
        sum -= 3;
        win ++;
        heap.push(t - 3);
    }
    cout << mn << " " << mx << "\n";
}
int main()
{

#ifndef ONLINE_JUDGE
   freopen("in.txt",   "r", stdin);
   freopen("out.txt", "w", stdout);
#endif
    
    IOS;
    while (cin >> n)
    {
        solve();
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值