【题解】足球比赛
题目描述
SJZEZ 和 TSYZ 正在进行一轮足球联谊赛,根据规则,这轮比赛有两场,一场在 SJZEZ 的主场进行,一场在 TSYZ 的主场进行。胜负判断标准如下:
- 在两场比赛中进球总数较多的一方赢得比赛。
- 如果双方进球总数相同,在对方主场进球更多的一方赢得比赛。
- 如果1、2都相同,胜利者将会随机产生= =
双方已经进行了一场比赛,作为 SJZEZ 的队长,忘川沧月童鞋想知道:
(1) 第二场 SJZEZ 最少需要进多少球,才有可能赢得比赛。
(2) 第二场 SJZEZ 进不超过多少个球,TSYZ 才有可能赢得比赛。
已知在一场比赛中,一方的进球数不可能多于 \(30\) 个。
输入格式
第一行一个整数 \(T\),表示该测试点中数据的组数。
接下来 \(T\) 行,每行一个字符串,描述该组数据中第一场比赛的情况,形式如wccy's team played WHERE game, scored x goals, and conceded y goals.
其中 WHERE
是 home
或者 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;
}
本文来自博客园,作者 5ab,转载请注明链接哦 qwq
博客迁移啦,来看看新博客吧 -> https://5ab-juruo.oier.space/