【题解】足球比赛

题目描述

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;
}
posted @ 2020-02-22 17:38  5ab  阅读(180)  评论(0编辑  收藏  举报