常笑Sunny 2025-08-22 17:28 采纳率: 100%
浏览 10
已结题

【基础】分数计数(求解答)

目标c++:
有n个球队1≤n≤100,编号为1,2,…,n,共进行n场比赛。每场比赛有一个胜队。计分方法如下:
是连胜中的第一次胜利,则本次胜利得1分。
是连胜中的第二次胜利,则本次胜利得2分。
是连胜中的第三次胜利,则本次胜利得3分。
连胜超过三次以上的胜场,每场得3分。
例如n=12,比赛的胜队为1 2 1 1 3 2 1 1 1 1 4 2,计分如下:
队1: 1+1+2+1+2+3+3=13分
队2: 1+1+1=3分
队3: 1分
队4: 1分
其余队为0分。

输入描述:n,x1两个整数,n为球队数,x1为第一次胜队号,第 i 场比赛(i≥2)胜队的编号由以下公式确定: xi=((xi-1×3703+1047) mod n)+1
输出描述:一个整数,即得分最多队的分数。

提示:
来源:2015江苏省青少年信息学奥林匹克竞赛复赛

示例:
输入:
10 5
输出:
3

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-08-22 17:45
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .  
    每日一句正能量,让它带给您好心情:别让犹豫,偷走你的可能性。
    .  

    根据问题描述,我们需要模拟n场比赛,计算每个球队的得分,并找出得分最高的分数。胜队序列由给定的递推公式生成。

    解题思路

    1. 初始化一个数组score记录每个球队的总得分,数组streak记录每个球队当前的连胜次数。
    2. 根据递推公式生成每场比赛的胜队编号(注意:球队编号从1到n,递推公式中mod n后加1确保范围正确)。
    3. 对于每场比赛的胜队:
      • 如果该队上一场也赢了(即连胜次数>=1),则本次得分基于连胜次数计算:
        • 第1次连胜:得1分
        • 第2次连胜:得2分
        • 第3次及以上连胜:得3分
      • 如果该队上一场没赢(即当前连胜次数为0),则本次得1分(开始新的连胜)。
    4. 更新该队的连胜次数(加1),并累加得分。
    5. 其他球队的连胜次数重置为0(因为他们的连胜被中断)。
    6. 最后找出所有球队中的最高得分。

    注意:每场比赛后,只有胜队保持连胜,其他球队的连胜都应中断(重置为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(因为他们的连胜被中断)。
    • 最后遍历所有球队,找出最高得分并输出。

    此方法正确模拟了比赛过程,并按照规则计算得分,最终输出最高分。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 已采纳回答 8月22日
  • 创建了问题 8月22日