【程序设计】P8772 [蓝桥杯 2022 省 A] 求和

🎈主页传送门:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》

🌟志不立,天下无可成之事

今天我们来看一道有意思的题目,22年蓝桥杯的题目:P8772 [蓝桥杯 2022 省 A] 求和,这道题是在洛谷上的,话不多说,我们直接来看题目:

由题可见,就是想叫我们先把相邻的两个数先进行相乘再相加,我们可以很快的想到一个办法:那就是遍历这n个整数,而这n个整数又可以放在数组里面进行操作:

cpp 复制代码
#include<stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	long long int arr[1005] = { 0 };
	for (int i = 0; i < num; i++)    //先进行数据的输入
	{
		scanf("%d", arr + i);
	}


	long long int ans = 0;   //两两相乘的结果
	long long int sum = 0;   //最后相加的结果

	//现在是遍历整个数组:
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = i + 1; j < num; j++)
		{
			ans = (*(arr + i)) * (*(arr + j));
			sum += ans;
		}
	}
	printf("%d", sum);
	return 0;
}

这样看觉得确实没什么问题,因为思路是对的,那我们提交到洛谷上面看看测评结果如何:

可见,代码的思路没有问题,但是仅仅对了三道题而已,剩下的都是RE****, 这是为啥?那就是我们的程序的时间复杂度太高了,运行时间超时了

现在来分析一下我们代码的时间复杂度:有两个循环其那套在一起,加上一个循环输入,那么整体的时间复杂度就是 T(n) = n²+5n+1010, 用大O渐进表示法就是O(n²)!!!,由此可见,这个时间复杂度是非常大的,那我们能不能优化一下呢?可以的兄弟,当然可以,我们要从题目本身出发,请看下图:

既然推导出现在这个公式,我们只需要根据公式来写代码即可,下面是修改之后的代码:

cpp 复制代码
#include <stdio.h>

int main() {
	long long sum_total = 0, sum_square = 0;
	int num, x;
	scanf("%d", &num);
	for (int i = 0; i < num; ++i) 
    {
		scanf("%d", &x);
        //输入一个数,就立即这个数进行相关的公式操作
		sum_total += x;   //ai的和
		sum_square += (long long)x * x;   //自己本身的平方的和
	}
	long long ans = (sum_total * sum_total - sum_square) / 2;
	printf("%lld\n", ans);
	return 0;
}

现在我们将这段代码再提交到洛谷上面看看测试结果:

哈哈,这样子写就通过了

以上是博主自己的拙见,欢迎大佬们提供更好的解决方案!!!

文章是自己写的哈,有啥描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读。

相关推荐
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
qq_339554821 天前
英飞凌ModusToolbox环境搭建
c语言·eclipse
张張4081 天前
(域格)环境搭建和编译
c语言·开发语言·python·ai
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集