这题意思就是文中的那个公式
这个公式相当于
如果知道这个的话,很多人可能都试过直接暴力,然后就出现了时间超限,然后就不知所措了。
我们先不管绝对值和1000时候
想想a=1 2 3 4的情况:
(1+1)+ (1+2)+ (1+3)+ (1+4)
(2+2)+ (2+3)+ (2+4)
(3+3)+ (3+4)
(4+4)
再想想a=1 1 1 1时的情况:
(1+1)+(1+1)+(1+1)+(1+1)
(1+1)+(1+1)+(1+1)
(1+1)+(1+1)
(1+1)
再a=1 1 1 1中,1 出现的次数为 4次
4*4+4 = 20;
20 / 2 = 10;
我们再去想想a=1 2 3 4时怎么得出的,就理解了
下面就是代码
#include "bits/stdc++.h" using namespace std; const int N = 1e6+5; int s[N]; int zhi[1005]; int main(){ int n; long long ans = 0; cin>>n; for(int i = 1;i<=n;i++){ cin>>s[i]; zhi[s[i]]++;//记录每个数出现的次数 ans += abs((long long)s[i]*2-1000);//自己+自己也要记录一下,直接存到结果ans里面 } //把0-1000全部的数枚举下 for(int i = 0;i<=1000;i++){ for(int j = 0;j<=1000;j++){ ans += (long long)zhi[i]*zhi[j]*abs(i+j-1000);//数之间匹配的结果之和 } } cout<<ans/2<<endl;//我们都是算了是双倍的,所以需要除2 }
以上想法是我赛后,看了大佬的代码,理解下后获得的想法,然后补题并且写下思路来提高自己,然后补知识点遗忘。