题目描述
今有 N 个数组,初始时,N 个数组均为空。共有 M 次操作,每次在第 X 个数组中加入数字 Y。问最终各数组中有多少数,并将它们排序输出。
比如,输入如下数据:
3 5
1 3
1 2
1 1
2 1
3 1
表示有 3 个数组,共有 5 次操作,分别向第 1 个数组存入 3,第 1 个数组存入 2 ,第 1 个数组存入 1,第 2 个数组存入 1,第 3 个数组存入1。
输出如下:
3 1 2 3
1 1
1 1
第 1 行表示:第 1 个数组中有 3 个数,排序结果为1 2 3;
第 2 行表示:第 2 个数组中有 1 个数,排序结果为 1;
第 3 行表示:第 3 个数组中有 1 个数,排序结果为 1;
输入
第一行两个整数 N、M(N≤100000,M≤3000)。
接下来 M 行,每行两个整数 X、Y,含义见试题描述。(1≤X≤N,Y≤1000000000)
输出
共 N 行;
第 i 行第一个数 SUM,表示第 i 个数组数的个数,接下来 SUM 个数,为排序之后的数组。
样例
输入
3 5
1 3
1 2
1 1
2 1
3 1
输出
3 1 2 3
1 1
1 1
代码1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> arrays(N);
vector<int> count(N);
for (int i = 0; i < M; i++) {
int X, Y;
cin >> X >> Y;
// 向第 X 个数组中加入数字 Y
arrays[X - 1].push_back(Y);
count[X - 1]++;
}
// 对每个数组进行排序
for (int i = 0; i < N; i++) {
sort(arrays[i].begin(), arrays[i].end());
}
// 输出结果
for (int i = 0; i < N; i++) {
cout << count[i] << " ";
for (int j = 0; j < count[i]; j++) {
cout << arrays[i][j] << " ";
}
cout << endl;
}
return 0;
}
在这段代码中,我们使用了一个二维向量 arrays
来存储 N 个数组,使用一个一维向量 count
来存储每个数组中的数字个数。首先,我们按照操作的要求,将数字加入对应的数组,并更新相应的计数器 count
。然后,我们对每个数组进行排序,使用 sort
函数进行排序。最后,我们按照要求输出结果,首先输出每个数组中的数字个数,接着按照排序后的顺序输出数组中的数字。
代码2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> arrays(N);
for (int i = 0; i < M; i++) {
int X, Y;
cin >> X >> Y;
// 向第 X 个数组中加入数字 Y
arrays[X - 1].push_back(Y);
}
// 输出结果
for (int i = 0; i < N; i++) {
sort(arrays[i].begin(), arrays[i].end()); // 对每个数组进行排序
cout << arrays[i].size() << " ";
for (int j = 0; j < arrays[i].size(); j++) {
cout << arrays[i][j] << " ";
}
cout << endl;
}
return 0;
}
在这段代码中,我们使用了一个二维向量 arrays
来存储 N 个数组。不再使用 count
向量来记录每个数组中的数字个数,而是直接使用 arrays[i].size()
来获取每个数组的大小。我们在读取操作时,直接将数字加入对应的数组,并不需要维护计数器。在输出结果时,先对每个数组进行排序,然后分别输出每个数组的大小和排序后的数字。这种方法更加直观和易懂。