K - 十日游戏
Description
在宇宙中存在著一種神秘的暗物質魔法球。這種魔法球分為陰球和陽球,當兩種球合并時就會釋放出巨大的能量。 每個球都有一個魔法值。現在給定你n對魔法球,請你找出所有的組合中魔法值最大的n種。 ( 組合意思是指一個陰球和一個陽球結合,魔法值為兩球之和,每個魔法球可以使用多次。)
Input
單組輸入。 第一行為兩個整數n(1<=n<=1e5) 第二行為n個整數,代表n個陽球的魔法值,每個整數值范圍(1-1e7)。 第三行為n個整數,代表n個陰球的魔法值,每個整數值范圍(1-1e7)。
Output
輸出1行,為n個由空格分割的整數,即為最后所求答案,最后一個整數后無空格。
Sample
Input
Output
10 9 9 8 8 #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; int a[MAXN], b[MAXN], ans[MAXN]; int n; void sift_down(int i) {int t;while (i <= n / 2) {if (ans[i] > ans[i * 2])t = i * 2;elset = i;if (i * 2 + 1 <= n && ans[t] > ans[i * 2 + 1]) t = i * 2 + 1;if (i != t) {int x = ans[i];ans[i] = ans[t];ans[t] = x;i = t;} else {break;}} } int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) scanf("%d", &b[i]);sort(a + 1, a + n + 1);sort(b + 1, b + n + 1);for (int i = 1; i <= n; i++) {ans[i] = a[i] + b[n];}for (int i = n; i >= 1; i--) {int f = 1;for (int j = n - 1; j >= 1; j--) {if (a[i] + b[j] > ans[1]) {f = 0;ans[1] = a[i] + b[j];sift_down(1);}}if (f == 1) break;}sort(ans + 1, ans + n + 1);for (int i = n; i > 1; i--) printf("%d ", ans[i]);printf("%d\n", ans[1]);return 0; }總結
- 上一篇: D - 数据结构实验之排序四:寻找大富翁
- 下一篇: JAVA期末简答题参考