ch2题解

news/2025/11/3 12:28:29/文章来源:https://www.cnblogs.com/whx-pikapi/p/19186731

ch2题解

A-数列有序

考察数组遍历和插入。

题意:

给你一个升序的长度为 \(n\)\(a\) 数组,然后给你一个 \(x\),把 \(x\) 插入到数组 \(a\) 中使它依然有序。

输出插入后的数组。

解题思路:

因为 \(a\) 数组是有序的,所以 \(x\) 应该插入到第一个 比他大或和他相等的位置前面。

找到这个位置idx,然后把[idx, n]的数都往后移动一位,注意要倒着移动,不然会被覆盖。

优化:不一定真的要插入,最终只是要求输出

调试方法:

把插入的所有情况都测试一下:

输入

3 1
2 6 8
3 3
2 6 8
3 7
2 6 8
3 9
2 6 8
0 0

输出

1 2 6 8 
2 3 6 8 
2 6 7 8 
2 6 8 9

把 2 6 8 的四个空都尝试插入一下,看有没有问题。

代码:

操作数组的解法:
#include<bits/stdc++.h>
using namespace std;const int N = 110;// 题目n属于[1, 100]
// const cpp独有的修饰符,表示常量,N=110不能被修改
int a[N];
// 完全可以不用const。int a[110]也可行
int main()
{int n, x;while (cin >> n >> x && (n != 0) && (x != 0)){for (int i = 1; i <= n; i ++ ) cin >> a[i];int idx = 1;// 寻找 x 应该在的位置while (idx <= n && a[idx] < x) idx ++;// idx可能在最后一位之后,即idx=n+1(x最大的情况)// 把 idx位置赋值为 x, 对于原来的[idx, n]位置的数都往后移动一位for (int i = n + 1; i >= idx + 1; i -- ) a[i] = a[i - 1];a[idx] = x;for (int i = 1; i <= n + 1; i ++ ) cout << a[i] << " ";cout << "\n";}return 0;
}
不操作数组的解法:
#include<bits/stdc++.h>
using namespace std;const int N = 110;// 题目n属于[1, 100]int a[N];int main()
{a[0] = -114514; // 给a[0]一个初始值,防止他随机一个很大的数// 可以自己试一下,定义一个数组,不给a[0]复制,输出他看一下结果,并重复运行几次// 变量也是同理,定义一个变量不赋值,输出他看看结果,并重复运行几次int n, x;while (cin >> n >> x && (n != 0) && (x != 0)){for (int i = 1; i <= n; i ++ ) cin >> a[i];for (int i = 1; i <= n; i ++ ){if (x > a[i - 1] && x <= a[i]) cout << x << " ";cout << a[i] << " ";}if (x > a[n]) cout << x;//如果x是最大的放到最后面cout << "\n";}return 0;
}

B-杨辉三角

考察二维数组遍历。

题意:

给你一个 \(n\),输出 \(n\) 行的杨辉三角。

解题思路:

首先明确二维数组的存储方式

1761996048842

如上图一个 \(4 \times 4\) 的二维数组 \(a\),它的正常顺序和我们数学中学的坐标系不同:

  • \(a_{00} = 1\)
  • \(a_{01} = 2\)
  • \(a_{03} = 3\)
  • ...
  • \(a_{33} = 16\)

杨辉三角的性质就是:对于坐标 \((x, y)\) 位置的值 = \((x - 1, y)\) 的值 + \((x - 1, y - 1)\) 的值

就是这个点的值等于它正上方加上左上方的值:

1
11
121
1331
14641

对于一个点上边是空的如何处理:可以把所有位置一开始都赋值成 \(0\)

10000
11000
13310
14641

这样显然方便处理。

代码:

代码:
#include<bits/stdc++.h>
using namespace std;const int N = 40;// 题目n属于[1, 30]int a[N][N];int main()
{int n;while(cin >> n){for (int i = 0; i < 40; i ++ ){for (int j = 0; j < 40; j ++ ){a[i][j] = 0;}}a[1][1] = 1;for (int i = 2; i <= n; i ++ ){for (int j = 1; j <= i; j ++ ){a[i][j] = a[i - 1][j] + a[i - 1][j - 1];}}for (int i = 1; i <= n; i ++ ){for (int j = 1; j <= i; j ++ ){cout << a[i][j] << " ";}cout << "\n";}cout << "\n";}return 0;
}

拓展解法:

直接利用公式求解每个位置的值

对于第 \(n\) 行第 \(m\) 列的值 = \(C(n-1, m-1)\) 组合数,即 C\(\binom{n-1}{m-1}\)

1761997743613

C$\binom{n}{m} 表示 $ \(n\) 个数中选择 \(m\) 的方案数,和手写的形式略有不同

C-bitset

考察循环,进制处理

题意:

输入一个正整数 \(n\),输入他的二进制

解题思路:

短除法

1761998325528

代码:

代码:
#include<bits/stdc++.h>
using namespace std;int main()
{int n;int a[32];while (cin >> n){int idx = 1;//index索引while (n){if (n % 2 == 0) a[idx] = 0;else a[idx] = 1;idx ++;n /= 2;}idx --;for (int i = idx; i >= 1; i -- ) cout << a[i];cout << "\n";}return 0;
}

D-Cookies

考察奇偶性分析。

题意:

\(n\) 袋饼干,每袋有 \(a_i\) 块。问拿走一袋后剩下饼干总数为偶数的方案数。

解题思路:

首先统计出来总和是多少块,这里设为 \(sum\) 块。

根据奇偶性分析:

  • 如果 \(sum\) 为奇数,那么根据 奇数 - 奇数 = 偶数,可知方案数为奇数的个数
  • 如果 \(sum\) 为偶数,那么根据 偶数 - 偶数 = 偶数,可知方案数为偶数的个数

可以统计袋子中数量为奇数的个数为 \(odd\),显然偶数的个数为 \(even = n - odd\)

代码:

代码:
#include<bits/stdc++.h>
using namespace std;const int N = 110; // 题目 $n$ 属于 $[1, 100]$int a[N];int main()
{int n; cin >> n;int sum = 0, odd = 0;for (int i = 1; i <= n; i ++ ){cin >> a[i], sum += a[i];if (a[i] % 2 == 1) odd ++;} int even = n - odd;if (sum % 2 == 0) cout << even;else cout << odd;return 0;
}

优化:

观察发现,数组其实完全可以不用,只需要记录 \(sum\)\(odd\) 即可,省掉一部分内存。

优化版本代码:

优化版本代码:
#include<bits/stdc++.h>
using namespace std;int main()
{int n; cin >> n;int sum = 0, odd = 0;for (int i = 1; i <= n; i ++ ){int x; cin >> x;sum += x;if (x % 2 == 1) odd ++;} int even = n - odd;if (sum % 2 == 0) cout << even;else cout << odd;return 0;
}

E-Life Without Zeros(循环)

考察数字处理,只用循环就可以解决

题意:

给你两个整数 \(a\)\(b\)\(c = a + b\)

分别把 \(a\), \(b\), \(c\)\(0\) 全部去掉,看处理后的 \(a\), \(b\), \(c\) 是否仍然满足 \(a + b = c\)

解题思路:

对于 \(a = 1230405\)

  1. 先循环处理每一位,把 \(0\) 筛去得到临时值 \(ta = 54321\)
  2. 然后再反转一下得到处理后的 \(a = 12345\)

\(b\), \(c\) 进行同样的操作。

代码:

代码:
#include<bits/stdc++.h>
using namespace std;int main()
{int a, b; cin >> a >> b;int c = a + b;// 把 a 去掉 0, 然后反转一下// a = 12034 -> ta = 4321 -> a = 1234// cout << a << " " << b << " " << c << "\n";int ta = 0;while (a){if (a % 10) ta = ta * 10 + a % 10;a /= 10;}while (ta){a = a * 10 + ta % 10;ta /= 10;}// bc同理int tb = 0;while (b){if (b % 10) tb = tb * 10 + b % 10;b /= 10;}while (tb){b = b * 10 + tb % 10;tb /= 10;}long long tc = 0;//!!!这里要开long long, 输入999999999 999999999 1999999998// 解开下面tc的输出注释,可以发现tc最大可能是8999999991超过了int的范围while (c){if (c % 10){tc = tc * 10 + c % 10;// cout << tc << "\n";} c /= 10;}while (tc){c = c * 10 + tc % 10;tc /= 10;}// cout << a << " " << b << " " << c << "\n";if (a + b == c) cout << "YES\n";else cout << "NO\n";return 0;
}

优化:

a,b,c去掉0的求解方法是一样的,所以可以封装成一个函数:

优化版本代码:
#include<bits/stdc++.h>
using namespace std;long long work(long long a)
{long long ta = 0;while (a){if (a % 10) ta = ta * 10 + a % 10;a /= 10;}while (ta){a = a * 10 + ta % 10;ta /= 10;}return a;
}int main()
{int a, b; cin >> a >> b;if ((long long)(work(a) + work(b)) == work(a + b)) cout << "YES\n";else cout << "NO\n";return 0;
}

F-Jeff and Digits

考察数学性质和贪心策略。

题意:

给你一个长度为 \(n\) 的数组 \(a\)\(a\) 数组的值只能是 \(0\) 或者 \(5\)。请你使用这 \(n\) 个数(可以不全用)凑出 \(90\) 的倍数,使这个数尽量大。如果无法凑出 \(90\) 的倍数,输出 \(-1\)

解题思路:

找规律分析:

for (int i = 0; i <= 1000; i += 90) cout << i << "\n";

通过枚举 \(90\) 的倍数:

0, 90, 180, 270, 360, 450, 540, 630, 720, 810, 900, 990, ...

可以发现 \(90\) 的倍数必须满足:

  1. 至少有一个 \(0\)(因为 \(90\) 的倍数一定是 \(10\) 的倍数)
  2. 数位和是 \(9\) 的倍数(因为 \(90\) 的倍数一定是 \(9\) 的倍数)

具体实现:

  • 统计数组中 \(5\) 的个数 \(c5\)\(0\) 的个数 \(c0\)
  • 如果 \(c0 = 0\),无法满足条件 1,输出 \(-1\)
  • 如果 \(c5 < 9\),无法满足条件 2,只能输出 \(0\)(如果 \(c0 > 0\)
  • 否则,使用 \(9 \times \lfloor \frac{c5}{9} \rfloor\)\(5\) 和所有 \(0\) 来构造最大数

\(\lfloor 3 / 2 \rfloor\)表示下取整 3/2=1.5 向下取整为1,计算机除法 默认下取整

代码:

代码:
#include<bits/stdc++.h>
using namespace std;const int N = 1010; // 题目 $n$ 属于 $[1, 1000]$int a[N];int main()
{int n; cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i];int c5 = 0, c0 = 0;for (int i = 1; i <= n; i ++ ){if (a[i] == 5) c5 ++;else c0 ++;}if (!c0) cout << "-1\n";else if (c5 < 9) cout << "0\n";else {for (int i = 1; i <= 9 * (c5 / 9); i ++ ) cout << "5";for (int i = 1; i <= c0; i ++ ) cout << "0";}return 0;
}

优化:

代码可以更简洁,不需要存储整个数组:

优化版本代码:
#include<bits/stdc++.h>
using namespace std;int main()
{int n; cin >> n;int c5 = 0, c0 = 0;for (int i = 0; i < n; i ++ ){int x; cin >> x;if (x == 5) c5 ++;else c0 ++;}if (c0 == 0) cout << "-1\n";else if (c5 < 9) cout << "0\n";else {int five_count = 9 * (c5 / 9);for (int i = 0; i < five_count; i ++ ) cout << "5";for (int i = 0; i < c0; i ++ ) cout << "0";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月3日。上课积极回答问题喜得三分

2025年11月3日。上课积极回答问题喜得三分上课积极回答问题喜得三分。今日我与软件需求与分析课程上积极回答王建民老师的问题获得了加三分的奖励以此为证。

Tita 项目经营版:全方位赋能企业项目全流程管理

在当今竞争激烈的商业环境中,企业的项目管理能力直接关系到其竞争力与发展潜力。Tita 项目经营版作为一款卓越的项目管理解决方案,为企业提供了从项目立项到结束的全流程精细化管理,助力企业实现高效运营与持续增长…

软件需求分析课堂加分 - 2305

软件需求分析课堂加分课堂积极发言+3

互测赛(4)总结

wxir没有交代码!!!举办了!!!

2025 年 11 月冷水机厂家推荐排行榜,螺杆冷水机,工业冷水机,水冷式冷水机,风冷式冷水机,螺杆式冷水机,小型冷水机公司推荐

2025年11月冷水机厂家推荐排行榜:专业选购指南 冷水机作为工业制冷领域的核心设备,在制造业、化工、医药、食品加工等行业中扮演着至关重要的角色。随着工业4.0时代的深入发展,冷水机技术也在不断升级迭代,从传统单…

2025 年 11 月新风系统厂家推荐排行榜,新风系统安装,中央新风系统,空调新风系统,室内新风系统,家用新风系统,大金格力品牌甄选

2025 年 11 月新风系统厂家推荐排行榜:专业视角下的品牌甄选与系统选型指南 随着建筑节能标准的提升和室内空气健康意识的普及,新风系统已成为现代建筑不可或缺的组成部分。根据建筑环境研究机构的数据显示,2024 年…

2025年11月珠海酒店实地评测榜:十强住宿参数与口碑排行一览

计划到珠海看海、参展、遛娃或出差,却常被“海景房是否真能看到海”“周末涨价三倍”“停车排队半小时”等吐槽劝退。2025年第三季度珠海市文化广电旅游体育局数据显示,全市星级酒店平均入住率78.4,情侣路沿线高端房…

2025年11月黄褐斑改善产品对比榜:五款高回购单品全维度评价

黄褐斑常被称为“斑中之王”,成因涉及紫外线累积、激素波动、屏障受损、血管炎症等多重通路,一旦形成便易反复。2025年国家药监局《化妆品功效宣称评价规范》升级后,淡斑类新品须通过人体功效测试方可备案,市场门槛…

#20232329易杨文轩 2025-2026-1 《网络与系统攻防技术》 实验四实验报告

1、实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶…

2025年11月黄褐斑改善产品评测榜:五款热门单品数据化对比推荐

站在镜子前,你或许正为两颊那片对称的淡褐色斑块发愁:遮瑕膏越用越厚,粉底色号越换越暗,拍照必开美颜,社交场合下意识低头。黄褐斑并非简单的“晒斑”,它常与激素波动、屏障受损、毛细血管扩张叠加,一旦处理不当…

2025年11月黄褐斑改善产品推荐榜:五款热门单品深度对比与评价

黄褐斑常被称为“斑中之王”,成因涉及黑色素沉积、血管扩张、屏障受损等多重机制,且易反复、难淡化。2025年行业监测显示,国内黄褐斑关注人群已突破1.2亿,其中30-45岁女性占比68%,敏感肌比例高达42%。政策层面,国…

简易小说文件查看器

简易小说文件查看器<?php // viewer.php - 小说目录文件列表查看器 if (!isset($_GET[novel]) || empty($_GET[novel])) {die(无效的小说名称); }$novelName = $_GET[novel]; $novelDir = "小说/" . $no…

2025年11月珠海酒店评价榜:商务休闲双需求住宿对比指南

计划到珠海出差或度假,很多人把“住得方便、住得安心”排在首位。情侣路、日月贝、香炉湾沙滩一线既是城市名片,也是交通与商业的交汇点,周边酒店常年入住率高于全市均值。公开数据显示,2024年珠海星级与品牌酒店平…

2025年建筑模型行业权威测评:中国建筑模型专业公司排名与深度解析

TOP1推荐:深圳市绿建模型设计有限公司 评价指数:★★★★★ 口碑评分:98分 行业表现:A+++++级 电话号码:18825255886 官网:https://www.lvjian1990.com/ 介绍: 深圳市绿建模型设计有限公司是国内建筑模型领域的…

前端chatbox

下载后开箱即用 1.设置2.选择模型代理 ollama,点ollama3. 获取模型(导入ollama的才可以使用!)4.退出设置后选择模型5.开始对话

2025年11月合肥建筑律师推荐榜:全过程覆盖能力对比评价

正在筹备工程结算却被合同漏洞卡住,或面对总包拖欠、签证被拒、工期索赔无门,合肥建筑行业上下游企业、实际施工人、项目经理在2025年第四季度集中进入诉讼与仲裁窗口期。安徽省高院公开数据显示,2024年全省建设工程…

空间计量模型,包括空间滞后模型、空间误差模型和空间杜宾模型

空间计量模型,包括空间滞后模型(SAR)、空间误差模型(SEM)和空间杜宾模型(SDM)。 空间计量模型基础 空间计量经济学考虑了空间依赖性,即"地理学第一定律":一切事物都与其他事物相关,但近处的事物比远处的…

2025 年塑料挤出设备厂家最新推荐榜单:深度甄选聚焦技术实力、客户认可及设备性能全方位测评塑料板材挤出设备/塑料挤出设备生产线/塑料管材挤出设备生产线公司推荐

引言 近期,行业权威协会针对塑料挤出设备制造企业开展了全面测评,测评数据显示,当前行业内设备合格率虽达 82%,但具备核心技术专利与完善售后服务的企业仅占 35%。本次测评采用多维度评估体系,从企业技术实力(含…

AtCoder Beginner Contest 430 ABCDEF 题目解析

A - Candy Cookie Law 题意 在高桥居住的 AtCoder 国家有一条奇怪的法律,即“如果一个人拥有的糖果数量 \(\ge A\),那么他拥有的饼干数量就必须 \(\ge B\)”。 高桥拥有 \(C\) 颗糖果和 \(D\) 块饼干,请判断高桥是否…