zoukankan      html  css  js  c++  java
  • 湖南省第十三届大学生计算机程序设计竞赛 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
    ",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
    ",num1,num2);
    74     }
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    宏定义中的#
    HDU1506 Largest Rectangle in a Histogram 动态规划
    HDU1864 最大报销额 DP
    POJ2771 Guardian of Decency 最大独立子集
    POJ1698 Alice's Chance 最大流
    HDU1003 Max Sum 动态规划
    eval格式化事件类型的字符串
    C#虚方法virtual详解
    c# 利用反射获得某个类或者对象的所有属性
    windows服务的通常写法
  • 原文地址:https://www.cnblogs.com/52why/p/7497139.html
Copyright © 2011-2022 走看看