湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心
2007: Football Training Camp【原创-转载请说明】
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 228 Solved: 30
Description
在一次足球联合训练中一共有n支队伍相互进行了若干场比赛。 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为平局则两支队伍各得1分。
Input
输入包含不超过1000组数据。 每组数据的第一行为一个整数n(2 ≤ n ≤ 20),第二行为n个整数s1, s2, …, sn(0 ≤ si ≤ 200, 1 ≤ i ≤ n),即各个队伍目前的得分。
Output
对于每组数据,用一行输出最少以及最多进行了多少场比赛,中间用一个空格隔开。 数据保证不会出现无解情况。
Sample Input
2 7 4 3 1 5 1 2 0 0
Sample Output
4 5 3 3 0 0
Hint
Source
湖南省第十三届大学生计算机程序设计竞赛
题解:比赛的时候陷在错误的思路里 其实这个题目真的水
每一场比赛如果是平局就总分增加2分 不然就加3分
所以要得到最多的比赛场次 就要优先平局
要得到最少的比赛场次 就要优先胜局
如果设置胜场的数目 如果总分为奇数 胜场数的下届就是1 不然就是0
因为如果是奇数 说明至少有一场是胜场
胜场数的上界就是 m
for(int i=0; i<n; ++i)
{
if(a[i]>=3)
m+=a[i]/3;
}
然后枚举胜场的场次 每一次增加2场胜场 保证剩下的总分是偶数
每一次枚举判断一下剩下的比分可不可以构成全是平局
如果可以的话 就说明这是一种符合情况的胜场次数
然后取符合情况中间 胜场最少的 和最多的 就是我们要求的答案了
1 #include<stdio.h> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<string.h> 6 #include<stack> 7 #include<queue> 8 using namespace std; 9 int a[30]; 10 int main() 11 { 12 int n,sum,m,ff,temp; 13 while(cin>>n) 14 { 15 int num1,num2; 16 ff=0; 17 priority_queue<int ,vector<int > ,less<int> >que; 18 sum=0; 19 m=0; 20 while(!que.empty()) 21 { 22 que.pop(); 23 } 24 for(int i=0; i<n; ++i) 25 { 26 scanf("%d",&a[i]); 27 sum+=a[i]; 28 que.push(a[i]); 29 if(a[i]>=3) 30 m+=a[i]/3; 31 } 32 if(m==0) 33 { 34 printf("%d %d\n",sum/2,sum/2); 35 continue; 36 } 37 if(sum%2==1) 38 { 39 ff=1; 40 temp=que.top()-3; 41 que.pop(); 42 que.push(temp); 43 m--; 44 sum-=3; 45 } 46 int flag=0; 47 if((2*que.top()<=sum)) 48 { 49 num1=ff+sum/2; 50 num2=ff+sum/2; 51 flag=1; 52 } 53 for(int i=1; 2*i<=m; ++i) 54 { 55 temp=que.top()-3; 56 que.pop(); 57 que.push(temp); 58 temp=que.top()-3; 59 que.pop(); 60 que.push(temp); 61 sum-=6; 62 if((2*que.top()<=sum))//剩下的比分是否可以全部构成平局 63 { 64 num1=ff+2*i+sum/2; 65 if(flag==0) 66 { 67 num2=ff+2*i+sum/2; 68 flag=1; 69 } 70 71 } 72 } 73 printf("%d %d\n",num1,num2); 74 } 75 return 0; 76 }
作者:红雨
出处:https://www.cnblogs.com/52why
微信公众号: 红雨python