取数游戏:C++ 代码实现
取数游戏:C++ 代码实现
题目描述
给出一个 n x n 的矩阵,进行取数游戏。
取数共 n 轮,第 i 轮需要从每行分别取一个没取过的数字,设取出的数字总和是 s,则第 i 轮的实际得分是 i * s。
求 n 轮取数的最大总得分。
输入格式
从标准输入读入数据。
第一行输入一个正整数 n(n <= 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;
}
代码解析
-
使用 struct st 结构体
num:存储矩阵中的数字值row:存储数字所在的行号col:存储数字所在的列号
-
排序
- 使用
sort函数对b数组进行降序排序,以便优先选择较大的数字
- 使用
-
访问标记
- 使用二维数组
vis记录每个数字是否被访问过
- 使用二维数组
-
计算得分
- 循环
n轮 - 每一轮从
b数组中选择未访问过的数字,并计算总和sum - 计算当前轮的得分
(i + 1) * sum,并累加到ans中
- 循环
注意
- 代码中使用了
const int MAXN = 100定义矩阵大小,可以根据需要修改。 - 代码使用了
sort函数,需要包含algorithm头文件。 - 代码使用了
struct和sort等 C++ 标准库中的元素,确保你的编译器支持这些功能。
优化
- 使用
struct结构体存储数字及其行列信息,方便排序和访问。 - 使用
sort函数进行降序排序,提高代码效率。 - 使用二维数组
vis记录数字是否被访问过,避免重复访问。
希望这段代码和解析对你有帮助!
原文地址: https://www.cveoy.top/t/topic/nKmR 著作权归作者所有。请勿转载和采集!