📜  门|门 IT 2005 |第 80 题(1)

📅  最后修改于: 2023-12-03 14:58:35.770000             🧑  作者: Mango

题目介绍

这是门|门 IT 2005比赛中的第80题,是一道经典的模拟题目。本题需要你模拟一个比赛框架,在框架中处理选手信息与比赛情况。

题目描述

比赛的选手有编号、姓名和成绩三个属性,其中编号和成绩都是整数,姓名是字符串。选手信息输入完毕后,需要对选手按成绩进行排名,并输出排名结果。

比赛过程中需要处理两种操作:

  1. 更新比赛成绩,即将某个选手的成绩修改为新的成绩。
  2. 重置比赛成绩,即将所有选手的成绩都设置为0。

解题思路

本题需要使用结构体(struct)处理选手信息,将选手信息存储在一个数组中,并针对选手成绩进行排序。比赛过程中需要处理两种操作,分别对应修改选手成绩和清零所有选手成绩,对于每个操作需要根据具体情况进行相应处理。

代码实现

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 110;

struct Player {
    int id;
    char name[100];
    int score;
} player[N];

bool cmp(Player a, Player b) {
    if (a.score != b.score) return a.score > b.score;
    else return a.id < b.id;
}

int main() {
    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> player[i].id >> player[i].name >> player[i].score;
    }

    sort(player, player + n, cmp);

    for (int i = 0; i < n; i++) {
        printf("%d %s %d\n", player[i].id, player[i].name, player[i].score);
    }

    int m;
    cin >> m;
    while (m -- ) {
        int k, s;
        cin >> k >> s;

        for (int i = 0; i < n; i++) {
            if (player[i].id == k) player[i].score = s;
        }

        sort(player, player + n, cmp);

        for (int i = 0; i < n; i++) {
            printf("%d %s %d\n", player[i].id, player[i].name, player[i].score);
        }
    }

    return 0;
}

思考题

  1. 本题中使用了结构体进行数据存储,你可以尝试使用其他数据结构存储选手信息,例如链表和树等。
  2. 本题中的两个操作均需要遍历所有选手进行操作,你可以思考如何使用更高效的算法实现这些操作?
  3. 本题中的排名方式是按照成绩高低排序,你可以思考如何根据其他属性(例如姓名)进行排名?