2022牛客寒假算法基础集训营1 H题 牛牛看云

题目描述

就像罗夏墨迹测试一样,同一片形状的云在不同人的眼中会看起来像各种各样不同的东西。

例如,现在天上飘过了一片长条状的云彩,hina说这片云长得像是薯条,moca说这片云长得像宾堡豆沙面包(5枚装),kasumi说这片云在闪闪发光,kokoro说这片云怎么看上去不开心呢,牛牛说这片云长得就像是:

Σi=1nΣj=in∣ai+aj−1000∣

现在给出整数序列a,请你帮牛牛求出这个式子的值。

输入描述:

 

第一行包括一个整数n(3≤n≤106)整数序列的长度。

第二行输入n个以空格分隔的整数ai(0≤ai≤1000),表示序列a。

输出描述:

输出一个整数,表示该式子的值。

示例1

输入

4
500 501 500 499

输出

8

思路

这题肯定是要跑双for的但是n的数据有点大所以不可能跑n的双for,不过a数组的数据才1000我们可以从这里下手,可以用map来记录每个数字出现过几次然后跑个双for就像500和501一共相减过两次我们只需要计算mp[500]*mp[501]*abs(500+501-1000)就可以了,假如数组是501,501,501,501那我们全部相同相减的时候是取出两个的所以就是C(mp[501],2)然后再加上自己和自己本身相减的次数就是mp[501]

#include "bits/stdc++.h"
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    long long n, m;
    long long cnt[1005];
    cin >> n;
    memset(cnt, 0, sizeof(cnt));
    for (int i = 1; i <= n; i++) {
        cin >> m;
        cnt[m]++;
    }
//    for (int i = 0; i <= 1000; i++) {
//        if (cnt[i] != 0) {
//            cout << i << " " << " " << cnt[i] << endl;
//        }
//    }
    long long num;
    long long sum = 0;
    for (int i = 0; i <= 1000; i++) {
        if (cnt[i] != 0) {
            for (int j = i; j <= 1000; j++) {
                if (cnt[j] != 0) {
                    if (i != j) {
                        num = cnt[i] * cnt[j];
                        sum += (num * abs(i + j - 1000));
                    } else {
                        num = cnt[i];
                        sum += (num + (num * (num - 1)) / 2)*abs(i+i-1000);
                    }
//                    cout<<i<<" "<<j<<" "<<sum<<endl;
                }
            }
        }
    }
    cout << sum << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值