让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。
如果答案让您满意,请采纳、点赞、关注,非常感谢!
.
每日一句正能量,让它带给您好心情:别让犹豫,偷走你的可能性。
.
根据问题描述,我们需要模拟n场比赛,计算每个球队的得分,并找出得分最高的分数。胜队序列由给定的递推公式生成。
解题思路
- 初始化一个数组
score记录每个球队的总得分,数组streak记录每个球队当前的连胜次数。 - 根据递推公式生成每场比赛的胜队编号(注意:球队编号从1到n,递推公式中
mod n后加1确保范围正确)。 - 对于每场比赛的胜队:
- 如果该队上一场也赢了(即连胜次数>=1),则本次得分基于连胜次数计算:
- 第1次连胜:得1分
- 第2次连胜:得2分
- 第3次及以上连胜:得3分
- 如果该队上一场没赢(即当前连胜次数为0),则本次得1分(开始新的连胜)。
- 更新该队的连胜次数(加1),并累加得分。
- 其他球队的连胜次数重置为0(因为他们的连胜被中断)。
- 最后找出所有球队中的最高得分。
注意:每场比赛后,只有胜队保持连胜,其他球队的连胜都应中断(重置为0)。
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, x1;
cin >> n >> x1;
vector<int> score(n + 1, 0); // 球队得分,索引1~n
vector<int> streak(n + 1, 0); // 当前连胜次数,索引1~n
int current_winner = x1;
for (int i = 1; i <= n; i++) {
if (i == 1) {
// 第一场比赛
current_winner = x1;
} else {
// 根据公式计算下一场胜队
current_winner = ((current_winner * 3703 + 1047) % n) + 1;
}
// 更新胜队的连胜和得分
streak[current_winner]++;
int current_streak = streak[current_winner];
if (current_streak == 1) {
score[current_winner] += 1;
} else if (current_streak == 2) {
score[current_winner] += 2;
} else {
score[current_winner] += 3;
}
// 其他球队连胜重置为0
for (int team = 1; team <= n; team++) {
if (team != current_winner) {
streak[team] = 0;
}
}
}
int max_score = 0;
for (int i = 1; i <= n; i++) {
if (score[i] > max_score) {
max_score = score[i];
}
}
cout << max_score << endl;
return 0;
}
代码说明
- 使用
vector<int> score记录每个球队的总得分,vector<int> streak记录每个球队的当前连胜次数。 - 首场比赛胜队为输入的
x1,后续比赛胜队通过递推公式计算。 - 每场比赛后,更新胜队的连胜次数和得分(根据连胜次数决定本次得分)。
- 其他球队的连胜次数重置为0(因为他们的连胜被中断)。
- 最后遍历所有球队,找出最高得分并输出。
此方法正确模拟了比赛过程,并按照规则计算得分,最终输出最高分。