题目:
做题思路:
注意到𝑛 ≤ 10的6次方而𝑎𝑖 ≤ 1000
可以看到𝑎[𝑖]范围很小
或者说极限数据下会有大量重复的值出现
我们就可以做出如下思路
我们把n序列里面所有的相同的数据
出现的次数统计
形成集合arr (arr只需要存储从1到1000的所有数字)
通过观察题目可以知道
题目所求的为所有数中任意两个数的相加减1000的绝对值相加
然后考虑两种情况:
1.选中的任意两个数相同的情况
|i+j-1000|*(arr[i]+arr[i]*(arr[i]-1)/2)[后面标粗的为进行的次数]
2.选中的任意两个数不相同的情况
|i+j-1000|*(arr[i]*arr[j])[后面标粗的为进行的次数]
然后我们可以直接
i从1到1000
j从1到1000
进行遍历
把所有的结果相加
得出最终的式子的值
代码详解:
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
#include<string>
#include<cmath>
#include<algorithm>
#include<cmath>
ll arr[1006]={0};//对原数组进行标零
int main()
{
ll n, sum = 0,t;
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &t);
arr[t]++;//对出现的次数进行统计
}
for(int i=0;i<=1000;i++)
{
for(int j=i;j<=1000;j++)
{
//总结果统计
sum+=abs(i+j-1000)*((i==j)?(arr[i]+arr[i]*(arr[i]-1)/2):(arr[i]*arr[j]));
}
}
cout<<sum;
return 0;
}
PS:新年快乐,各位