黑龙江大学程序设计竞赛(重现赛)——B题Help Me

链接: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;
}

如果大家有疑问可以在评论区提出哦,博主我会尽我绵薄之力为你解答哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值