题目如下:
儿童节到了,幼儿园里有N个小朋友,每个小朋友都希望得到一份礼物。幼儿园的老师准备了M份不同的礼物,每份礼物都有一个编号,从1到M。老师希望每个小朋友都能得到一份礼物,但是每个小朋友对礼物的喜好不同,老师希望尽可能地满足小朋友的喜好。
每个小朋友对礼物的喜好可以用一个整数数组表示,数组中的每个元素代表一个礼物编号,数组的顺序代表小朋友对礼物的喜好程度,即第一个元素代表最喜欢的礼物,第二个元素代表次喜欢的礼物,以此类推。
老师想知道,是否有可能为每个小朋友分配一份他们最喜欢的礼物,如果可以,输出每个小朋友分配到的礼物编号;如果不可以,输出无法满足所有小朋友的喜好。
输入:
- 第一行包含两个整数N和M,分别代表小朋友的数量和礼物的总数。
- 接下来的N行,每行包含M个整数,代表一个小朋友对礼物的喜好列表。
输出:
- 如果可以满足所有小朋友的喜好,输出N行,每行包含一个整数,代表每个小朋友分配到的礼物编号。
- 如果无法满足所有小朋友的喜好,输出一行字符串:"无法满足所有小朋友的喜好"。
示例:
输入:
3 5
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
输出:
1
2
3
怎么样,是不是很简单,来做做吧
下面是c++实现的完整代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool canAssignGifts(vector<vector<int>>& preferences, int N, int M) {
vector<int> giftAssignment(N, 0);
vector<bool> assigned(M, false);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
int gift = preferences[i][j];
if (!assigned[gift - 1]) {
giftAssignment[i] = gift;
assigned[gift - 1] = true;
break;
}
}
}
// 检测
for (int i = 0; i < N; ++i) {
if (giftAssignment[i] == 0) {
return false;
}
}
// 输出
for (int gift : giftAssignment) {
cout << gift << endl;
}
return true;
}
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> preferences(N, vector<int>(M));
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
cin >> preferences[i][j];
}
}
if (!canAssignGifts(preferences, N, M)) {
cout << "无法满足所有小朋友的喜好" << endl;
}
return 0;
}