【华为OD机试真题 C++】1016 - 整数对最小和 | 机试题+算法思路+考点+代码解析
文章目录
-
- 一、题目
-
- 🔸题目描述
- 🔸输入输出
- 🔸样例1
- 二、代码参考
- 作者:KJ.JK
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
💖系列专栏:华为OD机试真题(C++)
🍂专栏介绍: 华为OD机试真题汇总,使用C++来进行解析解答实现,帮助大家更好的AC题目,分享各种解题思路,让大家更好通过机试,持续更新中,欢迎大家订阅
一、题目
🔸题目描述
给定两个整数数组array1、array2,数组元素按升序排列。
假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,
并对取出的所有元素求和,计算和的最小值。
注意:
两对元素如果对应于array1、array2中的两个下标均相同,则视为同一对元素
🔸输入输出
输入
输入两行数组array1、array2,每行首个数字为数组大小size(0 < size <= 100);
0 < array1[i] <= 1000
0 < array2[i] <= 1000
接下来一行为正整数k
0 < k <= array1.size() * array2.size()
输出
满足要求的最小和
🔸样例1
输入
3 1 1 23 1 2 32输出
4说明:用例中,需要取2对元素取第一个数组第0个元素与第二个数组第0个元素组成1对元素[1,1];取第一个数组第1个元素与第二个数组第0个元素组成1对元素[1,1];求和为1+1+1+1=4,为满足要求的最小和。
二、代码参考
#include <bits/stdc++.h>using namespace std;typedef long long ll;struct node {int to, cost;node(int x1, int x2) {to = x1;cost = x2;}
};struct cmp {bool operator()(const node &a, const node &b) {return a.to + b.cost < a.cost + b.to;}
};priority_queue<node, vector<node>, cmp> PriorityQueue;int main()
{int n1, n2;cin >> n1;vector<int> nums1(n1);for (int i = 0; i < n1; i++) {cin >> nums1[i];}cin >> n2;vector<int> nums2(n2);for (int i = 0; i < n2; i++) {cin >> nums2[i];}int k;cin >> k;ll Min = 0;for (int i = 0; i < min(n1, k); ++i) {PriorityQueue.push({i, 0});}while (k > 0 && !PriorityQueue.empty()) {auto idx = PriorityQueue.top();PriorityQueue.pop();Min += nums1[idx.to] + nums2[idx.cost];if (idx.cost + 1 < n2) {PriorityQueue.push({idx.to, idx.cost + 1});}k--;}cout << Min << endl;return 0;
}
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习