版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/81980942
地址:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2007
思路:枚举赢的次数,记录可以赢的次数s3,以及总分数sum,先预处理将sum化为偶数,然后枚举赢的次数,每次加2次使得sum为偶数(因为平一次是加2)
Code :
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX_N=255;
int n;
int a[MAX_N];
int main()
{
while(cin>>n){
int sum=0,s3=0;
priority_queue<int> Q;
for(int i = 1 ; i <= n ; ++i)
{
cin>>a[i];
s3+=a[i]/3; sum+=a[i];
Q.push(a[i]);
}
int x1=0,x2=0;
int flag=0,ff=0;
if(!s3){
x1=x2=sum/2;
}else{
if(sum%2){
ff=1;
int t=Q.top(); Q.pop();
Q.push(t-3); sum-=3;
--s3;
}
if(2*Q.top()<=sum){
x1=ff+sum/2;
x2=ff+sum/2;
flag=1;
}
for(int i=1;2*i<=s3;++i)
{
int temp=Q.top()-3; Q.pop();
Q.push(temp);
temp=Q.top()-3; Q.pop();
Q.push(temp);
sum-=6;
if((2*Q.top()<=sum)){//剩下的比分是否可以全部构成平局
x1=ff+2*i+sum/2;
if(flag==0){
x2=ff+2*i+sum/2;
flag=1;
}
}
}
}
printf("%d %d\n",x1,x2);
}
}