[蓝桥杯] 求和(C语言)

题目链接

               P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷

题目理解

        这道题就是公式题,我们模拟出公式后,输出最终结果即可。

        本题不难,相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环,测试样例,直接拿下。

#include<bits/stdc++.h>
main()
{
	int n;
	scanf("%d",&n);
	int arr[n];
	long long sum=0;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			sum+=arr[i]*arr[j];
		}
	}
	printf("%lld",sum);
}

        不出意外的话……应该要出意外了。 

         当数据过多时,我们如果用两个for循环暴力解题,时间会超限。因此我们需要用到前缀和算法。

解题思路

        前缀和算法:前缀和是指一个数组某下标之前(包括该下标)的所有数组元素的和。通过预先计算前缀和数组,可以在后续查询数组任意区间和时,利用前缀和数组在常数时间内得出结果,从而减少重复计算,提高算法效率。

        看下面的公式能帮助我们更好的理解代码:

        完整代码 

#include<bits/stdc++.h>
// 主函数,程序的入口
// 注意:在标准 C 语言中,main 函数应显式声明返回类型为 int,这里虽可运行但不规范
int main()
{
    // 定义变量 n 用于存储输入整数的个数
    int n;
    // 从标准输入读取整数 n
    scanf("%d", &n);

    // s 为前缀和数组,s[i] 表示 a 数组中前 i 个数字之和
    // 定义两个长度为 n+1 的 long long 类型数组 a 和 s,并初始化为 0
    // 这里数组长度为 n+1 是为了方便处理,让数组下标从 1 开始
    long long a[n + 1] = {0}, s[n + 1] = {0};
    // 定义变量 sum 用于存储最终的计算结果,初始化为 0
    long long sum = 0;

    // 循环读取 n 个整数,并存储到数组 a 中
    for (int i = 1; i <= n; i++)
    {
        // 从标准输入读取一个整数,并存储到数组 a 的第 i 个位置
        // 注意:这里使用 %d 读取,实际 a 是 long long 类型,建议使用 %lld 更规范
        scanf("%d", &a[i]);
    }

    // 计算前缀和数组 s
    for (int i = 1; i <= n; i++)
    {
        // 根据前缀和的定义,s[i] 等于 s[i-1] 加上 a[i]
        s[i] = s[i - 1] + a[i];
    }

    // 计算两两相乘再相加的和
    for (int i = 1; i <= n; i++)
    {
        // s[n] 表示 a 数组中所有元素的和,s[i] 表示 a 数组中前 i 个元素的和
        // s[n] - s[i] 表示 a 数组中从第 i+1 个元素到第 n 个元素的和
        // a[i] * (s[n] - s[i]) 表示 a[i] 与后面所有元素相乘的和
        // 将其累加到 sum 中
        sum += a[i] * (s[n] - s[i]);
    }

    // 输出最终结果
    printf("%lld", sum);

    return 0;
}

拿下! 


———(如有问题,欢迎评论区提问)———

### 关于2024年蓝桥杯C语言的相关信息 目前尚未有具体的2024年蓝桥杯C语言题目发布,但可以根据往年的比赛形式内容推测可能涉及的知识点以及准备方法。 #### 往年蓝桥杯C语言题目的特点 蓝桥杯竞赛通常分为省赛国赛两个阶段。其C语言类别的题目涵盖了基础编程能力、数据结构算法设计等多个方面。以下是基于以往经验的一些常见考点: - **基本语法掌握**:如变量定义、循环控制语句等[^1]。 - **数值计算问题**:例如累加求和操作 `for (i = 1; i <= n; i++) { sum += i; }` 的实现方式可以用于解决简单的数学序列求值问题。 - **字符串处理**:统计特定字符出现次数可以通过双重遍历完成,如下述Python代码片段展示了如何计数数字'2'[²]: ```python cnt = 0 for i in range(1, 2021): for j in str(i): if j == '2': cnt += 1 print(cnt) # 结果为624 ``` - **组合排列逻辑**:对于需要考虑多个因素相互作用的情况,则可采用标记数组辅助判断是否满足条件[^3]。比如下面这段伪码描述了一个简单场景下的枚举过程: ```c bool take[10]; memset(take, false, sizeof(take)); void dfs(int step){ if(step==目标长度){ // 处理当前方案; return; } for(int k=允许范围下限;k<=上限;k++){ if(!take[k]){ take[k]=true; 数字选取并递归调用dfs(); take[k]=false;//回溯释放该位置供后续尝试其他可能性使用; } } } ``` #### 如何有效备考? 针对上述提到的各种类型习题,在日常训练过程中应当注重以下几个方面的提升: - 加强基础知识复习巩固,熟悉各类标准库函数的功能及其应用场景。 - 积极参与在线评测平台上的模拟练习活动,积累实战经验的同时发现自身薄弱环节加以改进优化。 - 学会合理运用调试工具定位错误原因快速修正程序缺陷提高效率。 至于报名事宜一般会在官方通知文件里明确告知时间节点及相关流程细节,请密切关注赛事官方网站或者授权培训机构发布的最新动态消息以免错过重要期限。 ### 提醒事项 由于实际考题还未公布所以以上仅为预测仅供参考学习之用具体应以正式版本为准!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bit_Le

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值