题意:给你一个含有N序列,问这个序列的价值为多少?这个序列的价值为:每个数和他前面的数跟他差值大于一的数的差值的和。也就是这个式子。
思路:思维题。t表示当前数字,sum记录前缀和,num[t]存t这个数字出现的次数。对于到第i个数字当前序列价值为(i - 1) * t - sum - num[t-1] + num[t + 1]。有个数据会炸long long,要用long double存。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
long double sum = 0, ans = 0;//前缀和,答案
unordered_map<long long, long long> num;//统计每个数字出现次数
for(int i = 1; i <= n; i++)
{
long long t; scanf("%lld",&t);
ans += (i - 1) * t - sum - num[t - 1] + num[t + 1];//统计答案
num[t]++;//统计数字出现次数
sum += t;//前缀和
}
printf("%.0Lf\n",ans);
}
return 0;
}
/*
5
1 2 3 1 3
4
6 6 5 5
4
6 6 4 4
*/