n个最小和代码实现

发布时间 2024-01-06 10:34:07作者: Boy^
 1 #include <iostream> // 引入输入输出流库
 2 #include <queue>    // 引入队列库
 3 #include <algorithm> // 引入算法库
 4 using namespace std; // 使用标准命名空间
 5 
 6 struct node { // 定义一个结构体,表示节点
 7     int a; // 节点的a属性
 8     int b; // 节点的b属性
 9     int num; // 节点的num属性
10     bool operator < (const node other) const { // 重载小于运算符,用于比较两个节点的大小
11         return num > other.num; // 返回num是否大于other的num
12     }
13 };
14 
15 priority_queue<node> pq; // 定义一个优先队列,元素类型为node
16 int A[50001], B[50001]; // 定义两个数组A和B,长度为50001
17 
18 int main() { // 主函数
19     int n; // 定义一个整数n
20     node temp; // 定义一个临时节点temp
21     cin >> n; // 从输入流中读取一个整数n
22     for (int i = 0; i < n; i++) { // 循环n次
23         cin >> A[i]; // 从输入流中读取一个整数并存入数组A的第i个元素
24     }
25     for (int i = 0; i < n; i++) { // 循环n次
26         cin >> B[i]; // 从输入流中读取一个整数并存入数组B的第i个元素
27     }
28     sort(A, A + n); // 对数组A进行排序
29     sort(B, B + n); // 对数组B进行排序
30     for (int i = 0; i < n; i++) { // 循环n次
31         temp.a = i; // 将i赋值给temp的a属性
32         temp.b = 0; // 将0赋值给temp的b属性
33         temp.num = A[i] + B[0]; // 计算A[i]和B[0]的和并赋值给temp的num属性
34         pq.push(temp); // 将temp压入优先队列pq
35     }
36     for (int i = 0; i < n; i++) { // 循环n次
37         temp = pq.top(); // 取出优先队列pq的顶部元素并赋值给temp
38         pq.pop(); // 弹出优先队列pq的顶部元素
39         if (i != n - 1) { // 如果i不等于n-1
40             cout << temp.num << " "; // 输出temp的num属性和一个空格
41         } else { // 如果i等于n-1
42             cout << temp.num << endl; // 输出temp的num属性并换行
43         }
44         if (temp.b != n - 1) { // 如果temp的b属性不等于n-1
45             temp.b++; // 将temp的b属性加1
46             temp.num = A[temp.a] + B[temp.b]; // 重新计算A[temp.a]和B[temp.b]的和并赋值给temp的num属性
47             pq.push(temp); // 将temp压入优先队列pq
48         }
49     }
50     return 0; // 返回0,表示程序正常结束
51 }