学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++周赛 | 汇总-CSDN博客
【题目描述】
给定两个包含 n 个正整数的数列 a1,a2,…,an 与 b1,b2,…,bn,解答如下问题:
对于所有满足 1≤i,j≤n 的整数组 (i,j),求出所有 max(ai,bj) 的和,即计算 ∑max(ai,bj)。
【输入】
第一行,包含一个整数 n。
第二行,包含 n 个整数 a1,a2,…,an。
第三行,包含 n 个整数 b1,b2,…,bn。
【输出】
一行一个整数,表示结果。
【输入样例】
3
1 3 9
6 2 7
【输出样例】
58
【代码详解】
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, a[1000005], cnta[1000005], b[1000005], cntb[1000005];
int main()
{
cin >> n; // 输入n
for (int i=1; i<=n; i++) { // 输入n个a[i]
scanf("%d", &a[i]);
cnta[a[i]]++;
}
for (int i=1; i<=n; i++) { // 输入n个b[i]
scanf("%d", &b[i]);
cntb[b[i]]++;
}
ll suma=0, sumb=0, ans=0;
for (int i=1000000; i>=1; i--) { // 从大到小遍历,主要是为了计算比这个数大的值的总和
if (cnta[i]!=0) { // 当a中有i时
ans += 1ll * cnta[i] * sumb; // 结果等于a中i的个数*b中比i大的总和
}
if (cntb[i]!=0) { // 当b中有i时
ans += 1ll * cntb[i] * suma; // 结果等于b中i的个数*a中比i大的总和
}
if (cnta[i]!=0 && cntb[i]!=0) { // 如果a和b中同时有i时
ans += 1ll * cnta[i] * cntb[i] * i; // 结果等于总的个数*i
}
suma += 1ll * i * cnta[i]; // 每轮计算a中到i为止的总和
sumb += 1ll * i * cntb[i]; // 计算b中到i为止的总和
}
printf("%lld", ans); // 打印ans
return 0;
}
【运行结果】
3
1 3 9
6 2 7
58