题目描述
就像罗夏墨迹测试一样,同一片形状的云在不同人的眼中会看起来像各种各样不同的东西。
例如,现在天上飘过了一片长条状的云彩,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;
}