用C++做2097:【22NOIP提高组】比赛(match)
时间: 2023-06-14 21:03:23 浏览: 360
题目描述:
给定两支队伍的比分,已知每一局比赛的胜负,求哪支队伍可能获得这场比赛的胜利。
规则如下:
- 比赛共进行 $n$ 局,每局比赛要么由一支队伍获胜,要么由另一支队伍获胜,不可能出现平局。
- 获得比赛胜利的队伍必须在 $n$ 局比赛中获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局。
输入格式:
- 第一行一个整数 $n$,表示比赛总共进行了 $n$ 局 $(1≤n≤100)$。
- 第二行一个整数 $a$,表示第一支队伍得分 $(0≤a≤n)$。
- 第三行一个整数 $b$,表示第二支队伍得分 $(0≤b≤n)$。
- 接下来 $n$ 行,每行给出一局比赛的结果,用 0 表示第一支队伍获胜,用 1 表示第二支队伍获胜。
输出格式:
- 如果第一支队伍可能获得比赛胜利,则输出 0。
- 如果第二支队伍可能获得比赛胜利,则输出 1。
- 如果两支队伍都有可能获得比赛胜利,则输出 -1。
思路分析:
根据题目描述,我们可以得知,获得比赛胜利的队伍必须获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局,因此,我们需要统计两支队伍分别获胜的局数。
对于一局比赛,如果第一支队伍获胜,则将第一支队伍的胜利局数加一,如果第二支队伍获胜,则将第二支队伍的胜利局数加一。
统计完两支队伍分别获胜的局数后,判断哪支队伍可能获得比赛胜利即可。
代码实现:
时间复杂度:$O(n)$
空间复杂度:$O(1)$
```c
#include <stdio.h>
int main()
{
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
int cnta = 0, cntb = 0;
for (int i = 1; i <= n; i ++ )
{
int x;
scanf("%d", &x);
if (x == 0) cnta ++ ;
else cntb ++ ;
}
int m = (n + 1) / 2;
if (a + cnta >= m && b + cntb < m) printf("0\n");
else if (b + cntb >= m && a + cnta < m) printf("1\n");
else printf("-1\n");
return 0;
}
```