取数游戏:C++ 代码实现

题目描述

给出一个 n x n 的矩阵,进行取数游戏。 取数共 n 轮,第 i 轮需要从每行分别取一个没取过的数字,设取出的数字总和是 s,则第 i 轮的实际得分是 i * s。 求 n 轮取数的最大总得分。

输入格式

从标准输入读入数据。 第一行输入一个正整数 nn <= 100)。 接下来 n 行,每行输入 n 个正整数 a[i][j]a[i][j] <= 10^6),构成一个矩阵。

输出格式

输出到标准输出。 输出一个整数,表示最大总得分。

样例 #1

样例输入 #1

3
1 3 2
4 2 4
1 3 1

样例输出 #1

48

C++ 代码

#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 100;

struct st {
    int num;
    int row;
    int col;
};

bool cmp(st a, st b) {
    return a.num > b.num;
}

int main() {
    int n;
    cin >> n;
    int a[MAXN][MAXN];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }

    st b[MAXN * MAXN];
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            b[cnt].num = a[i][j];
            b[cnt].row = i;
            b[cnt].col = j;
            cnt++;
        }
    }

    sort(b, b + n * n, cmp);

    int vis[MAXN][MAXN] = {0};
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (!vis[b[j].row][b[j].col]) {
                sum += b[j].num;
                vis[b[j].row][b[j].col] = 1;
            }
        }
        ans += (i + 1) * sum;
    }

    cout << ans << endl;
    return 0;
}

代码解析

  1. 使用 struct st 结构体

    • num:存储矩阵中的数字值
    • row:存储数字所在的行号
    • col:存储数字所在的列号
  2. 排序

    • 使用 sort 函数对 b 数组进行降序排序,以便优先选择较大的数字
  3. 访问标记

    • 使用二维数组 vis 记录每个数字是否被访问过
  4. 计算得分

    • 循环 n
    • 每一轮从 b 数组中选择未访问过的数字,并计算总和 sum
    • 计算当前轮的得分 (i + 1) * sum,并累加到 ans

注意

  • 代码中使用了 const int MAXN = 100 定义矩阵大小,可以根据需要修改。
  • 代码使用了 sort 函数,需要包含 algorithm 头文件。
  • 代码使用了 structsort 等 C++ 标准库中的元素,确保你的编译器支持这些功能。

优化

  • 使用 struct 结构体存储数字及其行列信息,方便排序和访问。
  • 使用 sort 函数进行降序排序,提高代码效率。
  • 使用二维数组 vis 记录数字是否被访问过,避免重复访问。

希望这段代码和解析对你有帮助!

取数游戏:C++ 代码实现

原文地址: https://www.cveoy.top/t/topic/nKmR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录