题目描述:
题解:
要想比赛次数尽可能的多,那么就让平局尽可能多,要想让比赛次数尽可能的少,那么就让胜场尽可能多。
已知分数,要根据分数来推出进行的比赛场数就得明白分数的分配方法。
我们知道胜一场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;
}