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

题目描述

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

输入格式

从标准输入读入数据。 第一行输入一个正整数 'n'('n≤100')。 接下来 'n' 行,每行输入 'n' 个正整数 'aij'('aij≤106'),构成一个矩阵。

输出格式

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

样例 #1

样例输入 #1

3
1 3 2
4 2 4
1 3 1

样例输出 #1

48

C++ 代码实现

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
int w[N][N];
bool st[N];
long long res;

struct Node
{
    int v, id;
}
row[N], col[N];

bool cmp(Node& a, Node& b)
{
    return a.v > b.v;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> w[i][j];

    for(int i = 1; i <= n; i++)
    {
        row[i].id = col[i].id = i;
        for(int j = 1; j <= n; j++)
        {
            row[i].v += w[i][j];
            col[i].v += w[j][i];
        }
    }

    sort(row + 1, row + n + 1, cmp);
    sort(col + 1, col + n + 1, cmp);

    for(int k = 1; k <= n; k++)
    {
        int r = row[k].id, c = col[k].id;
        int v = 0, x = 0, y = 0;
        for(int i = 1; i <= n; i++)
            if(!st[i])
            {
                if(w[r][i] > v)
                    v = w[r][i], x = r, y = i;
                if(w[i][c] > v)
                    v = w[i][c], x = i, y = c;
            }
        st[y] = true;
        res += (long long)k * v;
    }

    cout << res << endl;

    return 0;
}
取数游戏 - C++ 代码实现

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

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