Leo这一次有n个乒乓球袋子,里面装了n个乒乓球,球上有一个数字。如果从每个袋子里取一个球把数字加起来,可以得到个和。求这里面最小的n个数(不需要去重)怎么做+代码
时间: 2023-05-26 13:04:51 浏览: 76
一种简单的做法是先将每个袋子中的球的数字排序,然后从小到大依次取出每个袋子中的最小数字相加得到一个和,取前n个和即为所求的n个最小和。
代码实现如下:
```
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> balls(n); // 用二维vector存储每个袋子中的球的数字
for (int i = 0; i < n; i++) {
int k;
cin >> k;
balls[i].resize(k);
for (int j = 0; j < k; j++) {
cin >> balls[i][j];
}
sort(balls[i].begin(), balls[i].end()); // 排序
}
vector<int> sums(n);
for (int i = 0; i < n; i++) {
sums[i] = balls[i][0]; // 初始化每个和为每个袋子中的最小数字
}
vector<int> indices(n, 0); // 用于表示每个袋子当前取了哪一个数字
for (int i = 1; i < n; i++) {
int min_sum = sums[0];
int min_index = 0;
for (int j = 1; j < n; j++) {
if (sums[j] < min_sum) {
min_sum = sums[j];
min_index = j;
}
}
for (int j = 0; j < n; j++) {
if (j != min_index) {
sums[j] += balls[j][++indices[j]]; // 取下一个数字
}
}
}
sort(sums.begin(), sums.end());
for (int i = 0; i < n; i++) {
cout << sums[i] << " ";
}
return 0;
}
```
时间复杂度为O(n^2logn),空间复杂度为O(n)。
阅读全文