小猴编程周赛C++ | 求和

学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!

附上汇总贴:小猴编程C++周赛 | 汇总-CSDN博客


【题目描述】

给定两个包含 n 个正整数的数列 a1,a2,…,an 与 b1,b2,…,bn,解答如下问题:

对于所有满足 1≤i,jn 的整数组 (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
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值