0
点赞
收藏
分享

微信扫一扫

牛客寒假算法基础集训营1

云岭逸人 2022-02-19 阅读 72
算法c++

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

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

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

Σi=1nΣj=in∣ai+aj−1000∣\Sigma_{i=1}^{n} \Sigma_{j=i}^{n} |a_i+a_j-1000|Σi=1n​Σj=in​∣ai​+aj​−1000∣

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

输入描述:

第一行包括一个整数n(3≤n≤106)n(3\leq n \leq 10^6)n(3≤n≤106),整数序列的长度。

第二行输入nnn个以空格分隔的整数ai(0≤ai≤1000)a_i(0\leq a_i \leq 1000)ai​(0≤ai​≤1000),表示序列aaa。

输出描述:

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

示例1

输入

复制4 500 501 500 499

输出

复制8

题解:思路是枚举,ai的范围很小,而且由于要计算式的特殊性,使得我们不需要枚举每个数,而只需要知道这个数出现的次数同样可以计算出答案,那枚举范围就变成了[0,1000],这样复杂度是完全够的。

代码:

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int n;
long long cnt[1005];
int main(){
    cin>>n;
    int x;
    long long ans=0;
    for(int i=1;i<=n;i++){
        cin>>x;
        cnt[x]++;                //存每个数出现的次数
    }
    long long t=0;
    for(int i=0;i<=1000;i++){
        for(int j=i;j<=1000;j++){
            if(i==j) //相等时除了加上自身外,还要加上的相当于cnt个数中
                t=cnt[i]+cnt[i]*(cnt[i]-1)/2; //选两个数的组合
            else{                                  
                t=cnt[i]*cnt[j];   //不相等时直接将次数相乘
            }
            ans+=t*abs(i+j-1000);
        }
    }
    cout<<ans;
    return 0;
}

举报

相关推荐

0 条评论