链接:登录—专业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 <bits/stdc++.h>
using namespace std;
typedef long long ll;
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;
}