欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
编程题
B3867 小杨的储蓄
【题目来源】
洛谷:[B3867 GESP202309 三级] 小杨的储蓄 - 洛谷
【题目描述】
小杨共有N NN个储蓄罐,编号从0 00到N − 1 N-1N−1。从第1 11天开始,小杨每天都会往存钱罐里存钱。具体来说,第i ii天他会挑选一个存钱罐a i a_iai,并存入i ii元钱。过了D DD天后,他已经忘记每个储蓄罐里都存了多少钱了,你能帮帮他吗?
【输入】
输入2 22行,第一行两个整数N , D N,DN,D;第二行D DD个整数,其中第i ii个整数为a i {a_i}ai(保证0 ≤ a i ≤ N − 1 0 \le a_i \le N-10≤ai≤N−1)。
每行的各个整数之间用单个空格分隔。
保证1 ≤ N ≤ 1 , 000 1 \le N \le 1,0001≤N≤1,000;1 ≤ D ≤ 1 , 000 1 \le D \le 1,0001≤D≤1,000。
【输出】
输出N NN个用单个空格隔开的整数,其中第i ii个整数表示编号为i − 1 i-1i−1的存钱罐中有多少钱(i = 1 , ⋯ , N i=1, \cdots ,Ni=1,⋯,N)。
【输入样例】
2 3 0 1 0【输出样例】
4 2【算法标签】
《洛谷 B3867 小杨的储蓄》 #GESP# #2023#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intn;// 数组大小/编号范围inta[1005];// 计数数组,记录每个数字出现的"和"intd;// 天数/操作次数intt;// 每天输入的编号intmain(){// 输入数组大小n和天数dcin>>n>>d;// 处理每天的数据for(inti=1;i<=d;i++){// 输入当天的编号tcin>>t;// 在数组a[t]中累加当前天数ia[t]+=i;}// 输出a[0]到a[n-1]的值for(inti=0;i<n;i++){cout<<a[i]<<" ";}return0;}【运行结果】
2 3 0 1 0 4 2B3868 进制判断
【题目来源】
洛谷:[B3868 GESP202309 三级] 进制判断 - 洛谷
【题目描述】
N NN进制数指的是逢N NN进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五)。
现在有N NN个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F就只可能是十六进制,而1011则是四种进制皆有可能。
【输入】
输入格式
输入的第一行为一个十进制表示的整数N NN。接下来N NN行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以0 00开头。保证不会出现空行。
保证1 ≤ N ≤ 1000 1 \le N \le 10001≤N≤1000,保证所有字符串长度不超过10 1010。
【输出】
输出N NN行,每行4 44个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用1 11表示可能,使用0 00表示不可能。
例如,对于只可能是十六进制数的15A6F,就需要输出0 0 0 1;而对于四者皆有可能的1011,则需要输出1 1 1 1。
【输入样例】
2 15A6F 1011【输出样例】
0 0 0 1 1 1 1 1【算法标签】
《洛谷 B3868 进制判断》 #进制# #GESP# #2023#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intn;// 测试用例的数量string s;// 输入字符串charc;// 字符串中最大的字符intmain(){// 输入测试用例数量cin>>n;// 处理每个测试用例while(n--){// 输入一个字符串cin>>s;// 初始化最大字符为'0'c='0';// 找到字符串中最大的字符for(inti=0;i<s.size();i++){c=max(c,s[i]);// 更新最大字符}// 根据最大字符判断进制if(c<='1'){// 最大字符是'0'或'1'// 说明字符串是二进制cout<<"1 1 1 1"<<endl;}elseif(c<='7'){// 最大字符是'2'-'7'// 说明字符串是八进制cout<<"0 1 1 1"<<endl;}elseif(c<='9'){// 最大字符是'8'或'9'// 说明字符串是十进制cout<<"0 0 1 1"<<endl;}elseif(c<='F'){// 最大字符是'A'-'F'// 说明字符串是十六进制cout<<"0 0 0 1"<<endl;}else{// 最大字符大于'F'// 说明字符串不合法cout<<"0 0 0 0"<<endl;}}return0;}【运行结果】
2 15A6F 0 0 0 1 1011 1 1 1 1