链接:https://ac.nowcoder.com/acm/contest/877/B
来源:牛客网
题目描述
有一天Miss Quan出了一个题,给出一个长度为的数组
Miss Quan说给我计算下这个权值等于多少,然后随手写了一个式子,把她的小伙伴们都给惊呆了,这是什么鬼......
比如
听到这里,小伙伴们说这不是很简单吗,于是写出了下面的代码:
Miss Quan会心一笑,大家意识到事情并不简单,这个解法时间复杂度太高了,你能想出更好的计算Value的方法吗?只需要输出Value的值即可。
输入描述:
第一行输入一个整数代表共有组数据
。
对于每组测试用例第一行输入一个整数第二行输入
个数
输出描述:
对于每组数据,输出一行,一个整数代表的值.
示例1
输入
复制
2 3 1 4 2 2 10 20
输出
复制
14 100
示例2
输入
复制
1 4 5 6 8 7
输出
复制
20
这个题在重现重现赛的时候我绞尽脑汁也没想了出来(可能是智商问题吧),在纸上乱写乱画,与正确的方法擦肩而过。比赛结束后我看到大佬的代码才茅塞顿开。
大家可以在纸上化一下式子,是有规律的。
源代码:
#include <stdio.h>
const int N=50000;
int main()
{
int i,j,n,x;
long long a[N];
long long value=0,sum=0;
scanf("%d",&n);
while(n--)
{
value=0;
sum=0;
scanf("%d",&x);
for(i=0;i<x;i++)
scanf("%lld",&a[i]);
for(i=x-1;i>=0;i--)//核心算法
{
value-=2*a[i]*sum;
sum+=a[i];
value+=(a[i]*a[i]*(x-1));
}
printf("%lld\n",value);
}
return 0;
}
如果大家有疑问可以在评论区提出哦,博主我会尽我绵薄之力为你解答哦。