1

我正在尝试为在线法官解决这个问题:

n男女之分n。每个男人用从1到的数字来评估女性n,给她们不同的等级,每个女人的估计都与从1到的男性相似n。这一切都导致根据对双方最大吸引力的原则和幸福系数的计算形成对。幸福系数是男人的评价和女人的评价之和。

您必须最大化对的幸福系数的总和并输出这些对。

输入:

第一行包含一个自然的n地方1  ≤  n ≤ 1000——同性的人数。

下一n行包含男性对每个女性的评价。

n女性的最后几行类似地输入。

输出:

第一行应该包含对幸福系数的最大总和。

第二行应该依次包含男性的合作伙伴(首先是第一个人的合作伙伴,然后是第二个人的合作伙伴,依此类推)。

例子:

输入

3
1 2 3
2 3 1
1 2 3
1 2 3
2 3 1
3 1 2

输出

16
3 2 1

我有以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

void stable_marriage(vector<vector<int>> &matrix) {
    int n = matrix[0].size();
    vector<int> status(n * 2, -1);/*status[i] contains husband/wife of i, initially -1*/
    queue<int> q;
    for (int i = 0; i < n; i++)/* Push all single men */
        q.push(i);
    /* While there is a single men */
    while (!q.empty()) {
        int i = q.front();
        q.pop();
        /* iterate through his preference list */
        for (int j = 0; j < n; j++) {
            /* if girl is single marry her to this man*/
            if (status[matrix[i][j]] == -1) {
                status[i] = matrix[i][j];/* set this girl as wife of i */
                status[matrix[i][j]] = i;/*make i as husband of this girl*/
                break;
            }
            else {
                int rank_1, rank_2;/* for holding priority of current husband and most preferable husband*/
                for (int k = 0; k < n; k++) {
                    if (matrix[matrix[i][j]][k] == status[matrix[i][j]])
                        rank_1 = k;
                    if (matrix[matrix[i][j]][k] == i)
                        rank_2 = k;
                }
                /* if current husband is less attractive
                than divorce him and marry a new one making the old one
                single */
                if (rank_2 < rank_1) {/* if this girl j prefers current man i 
                                        more than her present husband */
                    status[i] = matrix[i][j];/* her wife of i */
                    int old = status[matrix[i][j]];
                    status[old] = -1;/*divorce current husband*/
                    q.push(old);/*add him to list of singles */
                    status[matrix[i][j]] = i;/* set new husband for this girl*/
                    break;
                }
            }
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        cout << status[i] << ' ';
    }
}
int main() {

    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int n;
    cin >> n;
    vector<vector<int>> matrix(n * 2, vector<int>(n));
    for (int i = 0; i < n * 2; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }

    stable_marriage(matrix);
    return 0;
}

现在,我不明白幸福系数是如何测量的?没看懂,能帮忙吗?

4

1 回答 1

1

这个问题表明,一对夫妇的幸福是他们对各自伴侣的评价的总和。您应该找到的值是可以与给定男女组成的 n 对夫妇的幸福总和的最大值。

例如,对于样本输入,以下配对是可能的。

A = (1, 1), (2, 2), (3, 3)
B = (1, 1), (2, 3), (3, 2)
C = (1, 2), (2, 1), (3, 3)
D = (1, 2), (2, 3), (3, 1)
E = (1, 3), (2, 2), (3, 1)
F = (1, 3), (2, 1), (3, 2)

正如您可以通过手动计算他们对彼此的评估来确认的那样,以下是每个场景可以获得的总和。

A = ( 2 + 6 + 5 ) = 13
B = ( 2 + 2 + 3 ) = 7
C = ( 4 + 4 + 5 ) = 13
D = ( 4 + 2 + 4 ) = 10
E = ( 6 + 6 + 4 ) = 16
F = ( 6 + 4 + 3 ) = 13

如您所见,可以实现的最大总幸福度为 16,如示例输出中所示。

于 2020-05-21T18:53:38.257 回答