当前位置: 首页 > news >正文

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

例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.mrgr.cn/news/54527.html

相关文章:

  • 面试后的想法
  • Ansible自动化工具
  • qtcreator 仿制vscode黑色背景主题monokai
  • Java比较两个Excel是否内容一致
  • 【MySQL】提高篇—复杂查询:多表连接(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)
  • CCRC-DSO数据安全官的作用
  • 使用 F5-TTS 生成指定人物的声音:一步步指南
  • 国产AI模型“Yi-Lightning”逆袭超越GPT-4!
  • 使用函数制作一个简易的计算机
  • Python学习的自我理解和想法(17)
  • 巴西税收政策及主要税收
  • 诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望
  • 【YOLO目标检测道路破损检测数据集】共665张、已标注txt格式、有训练好的yolov5的模型
  • PPT自动化:掌握 python-pptx 的基础元素
  • iOS -- 代码优化
  • 多IP访问多网段实验
  • 12、论文阅读:SpikeYOLO:高性能低能耗目标检测网络
  • 靠卡车赚钱,小马智行等待Robotaxi的春天
  • C语言代码风格指南:最佳实践与应用
  • 每日一练:贪心-K 次取反后最大化的数组和
  • csp普及组算法集训--Dfs
  • 电子元器件7805
  • 使用Maven前的简单准备
  • 小白也能剪出优秀视频:四大视频剪辑工具推荐!
  • gc current/cr block request类等待事件
  • 变量类型总是定义在变量前面吗?如何理解typedef定义的类型?