28——循环结构之累加应用(配套练习后续更新~~~~~)

devtools/2024/10/20 14:41:10/

例28.1 统计奖牌 (Standard IO 3167)

时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目:2008年北京奥运会,Y国的运动员参与了n天的决赛项目(1≤n≤20)。现在要统计一下Y国所获得的金、银、铜牌数目及总奖牌数。

输入
输入n+1行,第1行是Y国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。

输出
输出仅1行,包括4个整数,为Y国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。

样例输入

3
1 0 3
3 1 0
0 3 0

样例输出

4 4 3 11

这个问题是关于统计和基本的输入输出操作。我们需要从输入中读取天数和每天获得的金、银、铜牌数目,然后计算总数并输出。 首先,我们读取输入的天数n,然后使用一个循环来读取每一天的奖牌数目。在循环中,我们将每一天的金、银、铜牌数目加到相应的总数上。最后,我们将总数输出。 以下是解决这个问题的C++代码:

#include <iostream>
using namespace std;int main() {int n, gold, silver, bronze;cin >> n; // 读取天数int total_gold = 0, total_silver = 0, total_bronze = 0; // 初始化奖牌总数// 循环读取每一天的奖牌数目for (int i = 0; i < n; i++) {cin >> gold >> silver >> bronze;total_gold += gold; // 累加金牌数目total_silver += silver; // 累加银牌数目total_bronze += bronze; // 累加铜牌数目}// 输出金、银、铜牌总数及总奖牌数cout << total_gold << " " << total_silver << " " << total_bronze << " " << total_gold + total_silver + total_bronze << endl;return 0;
}

例28.2 求出e的值。

题目: 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e 。

输入:

输入只有一行,该行包含一个整数n(2<=n<=15),表示计算e时累加到1/n!。

输出:

输出只有一行,该行包含计算出来的e的值,要求打印小数点后10位。

样例输入:

10

样例输出:

2.7182818011

解题思路如下:

(1)理解问题:我们需要通过累加 1 和 1/n! 的项来逼近数学常数 e 的值,其中 n 是一个给定的整数,表示我们累加到 1/n! 这一项。

(2)初始化变量:我们需要一个变量来存储 e 的值,初始设为 1,因为级数的第一项是 1。

(3)计算阶乘:对于每一项 1/k!,我们需要计算 k! 的值。我们可以在循环中逐步计算阶乘,而不是每次都从头计算,这样可以提高效率。

(4)累加项:在循环中,我们计算每一项 1/k! 并加到 e 的值上。

(5)输出结果:最后,我们需要输出计算出的 e 的值,保留小数点后10位。

下面是用 C++ 实现的代码:

#include <iostream>
#include <iomanip> // 用于设置输出精度using namespace std;int main() {int n;cin >> n; // 读取输入的n值double e = 1.0; // 初始化e的值为1double factorial = 1.0; // 初始化阶乘值为1// 循环计算每一项1/k!并加到e上for (int k = 1; k <= n; ++k) {factorial *= k; // 计算k的阶乘e += 1 / factorial; // 累加1/k!到e}// 输出e的值,保留小数点后10位cout << fixed << setprecision(10) << e << endl;return 0;
}

保留10为小数的double型数据输出,也可以通过printf函数来实现:

 printf("%.10lf",e);  //注意此处0后面是字母l,不是数字1

一定要注意数据类型的问题,因为n!可能是一个很大的值,会超出整数的取值范围,所以此处我们定义为double类型,用printf函数输出小数时,其中单精度float类型对应的%f,双精度double类型对应%lf,长双精度long double类型对应%Lf。

例28.3 数列分段

题目:对于给定的一个长度为 N 的正整数数列 Ai,现要将其分成连续的若干段,并且每段和不超过 M(可以等于 M),问最少能将其分成多少段使得满足要求。

输入:

第一行包含两个正整数 N,M,表示了数列 Ai​ 的长度与每段和的最大值;

第二行包含 N个空格隔开的非负整数 Ai。

数据范围:1<=N<=_{10}5,1<=Ai<=M<=_{10}4

输出:

输出一个正整数,为最少划分的段数。

样例输入:

 5 6

 4 2 4 5 1

样例输出:

3

#include <iostream>
using namespace std;int main() {int N, M;cin >> N >> M;int cnt = 1, sum = 0;for (int i = 0; i < N; i++) { // 修正循环条件为 i < Nint a;cin >> a;if (sum + a > M) { // 如果加上当前元素后和超过Mcnt++; // 增加段数sum = a; // 重置当前段的和为当前元素} else {sum += a; // 否则,将当前元素加入当前段}}cout << cnt << endl; // 输出最少划分的段数,并添加换行符return 0;
}

上面的代码实现了一个贪心算法来解决数列分段问题。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。以下是该算法的详细分析:

(1)初始化变量:

  • cnt:用于记录分段的数量,初始值为1,因为至少需要一个段。
  • sum:用于记录当前段的和,初始值为0。

(2)读取输入:

  • 首先读取数列的长度 N 和每段和的最大值 M。
  • 然后通过一个循环读取数列中的每个元素 a。

(3)遍历数列:

  • 使用一个 for 循环遍历数列中的每个元素,循环变量 i 从0开始,直到 N-1。
  • 在每次迭代中,读取当前元素 a。

(4)检查当前段的和:

  • 在将当前元素 a 加入当前段之前,先检查如果加入这个元素后,当前段的和是否超过 M。
  • 如果超过,说明当前段不能再添加更多的元素,需要开始一个新的段。此时,增加 cnt 的值,并将 sum 重置为当前元素 a 的值,这样 a 就成为新段的第一个元素。
  • 如果不超过,将当前元素 a 加入当前段的和 sum 中。

(5)输出结果:

  • 遍历完所有元素后,cnt 中存储的就是最少需要的段数。
  • 输出 cnt 的值。

这个算法的关键在于,它在每一步都做出了一个局部最优的选择:如果当前元素可以被加入当前段而不超出限制,那么就加入;否则,就新开一个段。通过这种方式,算法试图在整个过程中保持段数最少,从而实现了全局的优化。这种方法是贪心算法的典型应用,因为它在每一步都做出了当前看起来最优的选择。


http://www.ppmy.cn/devtools/127310.html

相关文章

springboot030甘肃非物质文化网站的设计与开发(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;甘肃非物质文化网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本甘肃非物质文化…

Camera系统知识整理

本文是用来记录常用的Camera系统知识相关的文章 -- ing 1 图像格式 视频存储格式YUV420 NV12 NV21 i420 YV12详解 视频存储格式YUV420 NV12 NV21 i420 YV12详解_yuv420sp-CSDN博客 YUV&#xff08;YCbCr&#xff09;色彩空间详解 YUV&#xff08;YCbCr&#xff09;色彩空间…

学习虚幻C++开发日志——TSet

TSet 官方文档&#xff1a;虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数&#xff0c;使用数据值本身作为键&#xff0c;而不是将数据值与独立的键相关联。 默认情况下&#xff0c;TSet 不支持重…

《深度学习》OpenCV EigenFaces算法 人脸识别

目录 一、EigenFaces算法 1、什么是EigenFaces算法 2、原理 3、实现步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;构建模型 4&#xff09;识别 4、优缺点 1&#xff09;优点 2&#xff09;缺点 二、案例实现 1、完整代码 运行结果&#xff…

【星闪开发连载】WS63E模组的速度测试

目录 ​编辑 引言 程序工作原理 客户端 服务器端 测试记录 近距离测试 相邻两个房间之间的测试 相隔一个房间的两个房间之间的测试 结语 引言 今天终于又有点时间了&#xff0c;来测试一下星闪的数据传输速度。前面的博文已经分析了星闪的传输示例sle_uuid_client和…

Redis高可用与分布式方案实战指南

Redis作为一种高性能的内存数据库&#xff0c;在实际应用中常常需要考虑高可用性和分布式架构。本文将详细介绍Redis的高可用解决方案&#xff08;如Redis Sentinel&#xff09;和分布式方案&#xff08;如Redis Cluster&#xff09;&#xff0c;帮助您构建可靠且高效的Redis系…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

S7-200 SMART 与 S7-1200 之间 TCP 通信— S7-200 SMART 作为服务器

TCP 协议通信 TCP 通信为面向连接的通信&#xff0c;需要双方都调用指令以建立连接及交换数据。S7-200 SMART 与 S7-1200 通过 TCP 通信&#xff0c;在 S7-1200 调用 T-block 指令 ( TCON, TDISCON, TSEND, TRCV ) &#xff0c;在 S7-200 SMART 调用 Open User Communication …