1

GESP认证C++编程真题解析 | 202309 三级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


编程题

B3867 小杨的储蓄

【题目来源】

洛谷:[B3867 GESP202309 三级] 小杨的储蓄 - 洛谷

【题目描述】

小杨共有 \(N\) 个储蓄罐,编号从 \(0\)\(N-1\)。从第 \(1\) 天开始,小杨每天都会往存钱罐里存钱。具体来说,第 \(i\) 天他会挑选一个存钱罐 \(a_i\),并存入 \(i\) 元钱。过了 \(D\) 天后,他已经忘记每个储蓄罐里都存了多少钱了,你能帮帮他吗?

【输入】

输入 \(2\) 行,第一行两个整数 \(N,D\);第二行 \(D\) 个整数,其中第 \(i\) 个整数为 \({a_i}\)(保证 \(0 \le a_i \le N-1\))。

每行的各个整数之间用单个空格分隔。

保证 \(1 \le N \le 1,000\)\(1 \le D \le 1,000\)

【输出】

输出 \(N\) 个用单个空格隔开的整数,其中第 \(i\) 个整数表示编号为 \(i-1\) 的存钱罐中有多少钱(\(i=1, \cdots ,N\))。

【输入样例】

2 3
0 1 0

【输出样例】

4 2

【算法标签】

《洛谷 B3867 小杨的储蓄》 #GESP# #2023#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int n;              // 数组大小/编号范围
int a[1005];        // 计数数组,记录每个数字出现的"和"
int d;              // 天数/操作次数
int t;              // 每天输入的编号

int main()
{
    // 输入数组大小n和天数d
    cin >> n >> d;
    
    // 处理每天的数据
    for (int i = 1; i <= d; i++)
    {
        // 输入当天的编号t
        cin >> t;
        // 在数组a[t]中累加当前天数i
        a[t] += i;
    }
    
    // 输出a[0]到a[n-1]的值
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    
    return 0;
}

【运行结果】

2 3
0 1 0
4 2 

B3868 进制判断

【题目来源】

洛谷:[B3868 GESP202309 三级] 进制判断 - 洛谷

【题目描述】

\(N\) 进制数指的是逢 \(N\) 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五)。

现在有 \(N\) 个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F 就只可能是十六进制,而 1011 则是四种进制皆有可能。

【输入】

输入格式

输入的第一行为一个十进制表示的整数 \(N\)。接下来 \(N\) 行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以 \(0\) 开头。保证不会出现空行。

保证 \(1 \le N \le 1000\),保证所有字符串长度不超过 \(10\)

【输出】

输出 \(N\) 行,每行 \(4\) 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 \(1\) 表示可能,使用 \(0\) 表示不可能。

例如,对于只可能是十六进制数的 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>
using namespace std;

int n;         // 测试用例的数量
string s;      // 输入字符串
char c;        // 字符串中最大的字符

int main()
{
    // 输入测试用例数量
    cin >> n;
    
    // 处理每个测试用例
    while (n--)
    {
        // 输入一个字符串
        cin >> s;
        
        // 初始化最大字符为'0'
        c = '0';
        
        // 找到字符串中最大的字符
        for (int i = 0; i < s.size(); i++)
        {
            c = max(c, s[i]);  // 更新最大字符
        }
        
        // 根据最大字符判断进制
        if (c <= '1')
        {
            // 最大字符是'0'或'1'
            // 说明字符串是二进制
            cout << "1 1 1 1" << endl;
        }
        else if (c <= '7')
        {
            // 最大字符是'2'-'7'
            // 说明字符串是八进制
            cout << "0 1 1 1" << endl;
        }
        else if (c <= '9')
        {
            // 最大字符是'8'或'9'
            // 说明字符串是十进制
            cout << "0 0 1 1" << endl;
        }
        else if (c <= 'F')
        {
            // 最大字符是'A'-'F'
            // 说明字符串是十六进制
            cout << "0 0 0 1" << endl;
        }
        else
        {
            // 最大字符大于'F'
            // 说明字符串不合法
            cout << "0 0 0 0" << endl;
        }
    }
    
    return 0;
}

【运行结果】

2
15A6F
0 0 0 1
1011
1 1 1 1
posted @ 2026-01-19 17:28  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报