湖南省第十三届大学生计算机程序设计竞赛 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 }
View Code

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值