【题解】足球比赛

题目简介

SJZEZ 和 TSYZ 正在进行一轮足球联谊赛,根据规则,这轮比赛有两场,一场在 SJZEZ 的主场进行,一场在 TSYZ 的主场进行。胜负判断标准如下:

  1. 在两场比赛中进球总数较多的一方赢得比赛。
  2. 如果双方进球总数相同,在对方主场进球更多的一方赢得比赛。
  3. 如果1、2都相同,胜利者将会随机产生= =

双方已经进行了一场比赛,作为 SJZEZ 的队长,忘川沧月童鞋想知道:

(1) 第二场 SJZEZ 最少需要进多少球,才有可能赢得比赛。

(2) 第二场 SJZEZ 进不超过多少个球,TSYZ 才有可能赢得比赛。

已知在一场比赛中,一方的进球数不可能多于 \(30\) 个。

输入格式

第一行一个整数 \(T\),表示该测试点中数据的组数。

接下来 \(T\) 行,每行一个字符串,描述该组数据中第一场比赛的情况,形式如wccy's team played WHERE game, scored x goals, and conceded y goals.

其中 WHEREhome 或者 away 中的一个,home 表示第一场比赛是在 SJZEZ 的主场进行,away表示第一场比赛是在 TSYZ 的主场进行。\(x\)\(y\) 是整数,分别表示忘川沧月的队伍的进球数,和对方的进球数。

输出格式

输出 \(T\) 行,每行包含两个用空格隔开的整数,分别是两个问题的答案。

数据范围 \(\&\) 评测限制

各个测试点 \(1000\;\textrm{ms}\)\(1\;\textrm{GiB}\)

对于 \(100\%\) 的数据,\(1\le t\le 500\)\(0\le x,y\le 30\)

分析

注意到题目中给出的两个子问题。我们分别考虑。

最少要进多少个球才有可能赢

我们用极端思维。考虑下一场对方一个都不进的情况。

那么,我们只要从小到大枚举,找到可能获胜的点就输出。

但是,是否在自己的主场对结构是有影响的。所以我们还要分类考虑。

最多进多少个球对方有可能赢

这个子问题就如出一辙了。只需要将枚举方向反过来,假设对方全进球就行了。

Code

下面贴上代码。如果要参考的话可以注意一下细节。

#include <cstdio>
using namespace std;

const int max_ball = 30;
char place[10];

int main()
{
    int n, pa, pb, ts;
    
    scanf("%d", &n);
    
    while (n--)
    {
        scanf("%*s %*s %*s %s %*s %*s %d %*s %*s %*s %d %*s", place, &pa, &pb);
        
        if (place[0] == 'h')
        {
            for (ts = 0; ts <= max_ball; ts++)
            {
                if (pa + ts < pb)
                    continue;
                if (pa + ts == pb && ts < pb)
                    continue;
                
                break;
            }
            printf("%d ", ts);
            
            for (ts = max_ball; ts >= 0; ts--)
            {
                if (pa + ts > pb + max_ball)
                    continue;
                if (pa + ts == pb + max_ball && ts > pb)
                    continue;
                
                break;
            }
            
            printf("%d\n", ts);
        }
        else
        {
            for (ts = 0; ts <= max_ball; ts++)
            {
                if (pa + ts < pb)
                    continue;
                
                break;
            }
            printf("%d ", ts);
            
            for (ts = max_ball; ts >= 0; ts--)
            {
                if (pa + ts > pb + max_ball)
                    continue;
                
                break;
            }
            printf("%d\n", ts);
        }
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/5ab-juruo/p/solution-20200217-play.html