1

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

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

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

适合人群:

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

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


编程题

B3925 小猫分鱼

【题目来源】

洛谷:[B3925 GESP202312 三级] 小猫分鱼 - 洛谷

【题目描述】

海滩上有一堆鱼,\(N\) 只小猫来分。第一只小猫把这堆鱼平均分为 \(N\) 份,多了 \(i<N\) 个,这只小猫把多的 \(i\) 个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成 \(N\) 份,又多了 \(i\) 个,小猫同样把多的 \(i\) 个扔入海中,拿走了一份。第三、第四、……,第 \(N\) 只小猫仍是最终剩下的鱼分成 \(N\) 份,扔掉多了的 \(i\) 个,并拿走一份。

编写程序,输入小猫的数量 \(N\) 以及每次扔到海里的鱼的数量 \(i\),输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。

例如:两只小猫来分鱼 \(N=2\),每次扔掉鱼的数量为 \(i=1\),为了每只小猫都可吃到鱼,可令第二只小猫需要拿走 \(1\) 条鱼,则此时待分配的有 \(3\) 条鱼。第一只小猫待分配的鱼有 \(3\times 2+1=7\) 条。

【输入】

总共 \(2\) 行。第一行一个整数 \(N\),第二行一个整数 \(i\)

保证 \(0<N<10\)\(i<N\)

【输出】

一行一个整数,表示满足要求的海滩上最少的鱼数。

【输入样例】

2
1

【输出样例】

7

【算法标签】

《洛谷 B3925 小猫分鱼》 #GESP# #2023#

【代码详解】

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

int n, i;  // n: 总人数, i: 最后一个人的编号

/**
 * 检查给定的s(分给第一个人的数量)是否有效
 * 并计算最后剩下的人数
 * @param s 分给第一个人的数量
 * @return 如果有效返回最后人数,否则返回0
 */
int check(int s)
{
    // 第一次分配后剩下的人数
    int k = s * n + i;
    
    // 模拟n-1次分配(因为第一次已经分配了)
    for (int x = 2; x <= n; x++)
    {
        // 检查是否能被n-1整除
        if (k % (n - 1) != 0)
        {
            return 0;  // 不能整除,无效
        }
        
        // 更新k为下一次分配前的人数
        k = k / (n - 1) * n + i;
    }
    
    // 返回最后剩下的人数
    return k;
}

int main()
{
    // 输入总人数n和最后一个人的编号i
    cin >> n >> i;
    
    // 特殊情况:n=1
    if (n == 1)
    {
        cout << 1 << endl;  // 只有一个人,分给自己
        return 0;
    }
    
    // 从s=1开始尝试
    int s = 1;
    while (true)
    {
        int ans = check(s);
        if (ans > 0)  // 找到有效解
        {
            cout << ans << endl;
            break;
        }
        s++;  // 尝试下一个s
    }
    
    return 0;
}

【运行结果】

2
1
7

B3926 单位转换

【题目来源】

洛谷:[B3926 GESP202312 三级] 单位转换 - 洛谷

【题目描述】

小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。

小杨只学了长度单位和重量单位,具体来说:

  • 长度单位包括千米(km)、米(m)、毫米(mm),它们之间的关系是:\(1\text{km} = 1000\text{m} = 1000000\text{mm}\)
  • 重量单位包括千克(kg)、克(g)、毫克(mg),它们之间的关系是:\(1\text{kg} = 1000\text{g} = 1000000\text{mg}\)

小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为克。

现在,请你帮忙完成单位转换的程序。

【输入】

输入的第一行为一个整数,表示题目数量。

接下来 \(N\) 行,每行一个字符串,表示转换单位的题目,格式为 \(x\) 单位 \(1 = ?\) 单位 \(2\)。其中,\(x\) 为一个不超过 \(1000\) 的非负整数, 单位 \(1\) 和 单位 \(2\) 分别为两个单位的英文缩写,保证它们都是长度单位或都是重量单位,且 单位 1单位 2 更大。

例如,如果题目需要你将 \(1\text{km}\) 转换为 \(\text{mm}\),则输入为 1 km = ? mm

保证 \(1\le N \le 1000\)

【输出】

输出 \(N\) 行,依次输出所有题目的答案,输出时,只需要将输入中的 \(?\) 代入答案,其余部分一字不差地输出即可。由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 \(x\) 是整数,因此答案一定也是整数。

例如,如果题目需要你将 \(1\text{km}\) 转换为 \(\text{mm}\),则输入为 1 km = ? mm。则你需要输出 1 km = 1000000 mm

【输入样例】

2
1 km = ? mm
1 m = ? mm

【输出样例】

1 km = 1000000 mm
1 m = 1000 mm

【算法标签】

《洛谷 B3926 单位转换》 #GESP# #2023#

【代码详解】

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

int n;  // 测试用例的数量
int k;  // 数值
string a, b, c, d;  // 字符串变量,实际只使用a和d
// a: 源单位
// b: 字符串"is"
// c: 字符串"equal"
// d: 目标单位

int main()
{
    // 输入测试用例数量
    cin >> n;
    
    // 处理每个测试用例
    while (n--)
    {
        // 输入格式: 数值 源单位 is equal 目标单位
        cin >> k >> a >> b >> c >> d;
        
        // 特殊情况处理: 数值为0
        if (k == 0)
        {
            // 0的任何单位转换都是0
            cout << k << " " << a << " = " << k << " " << d << endl;
            continue;  // 继续处理下一个用例
        }
        
        // 处理长度单位转换
        if (a == "km" && d == "m")
        {
            // 千米转米: 乘以1000
            cout << k << " " << a << " = " << k << "000 " << d << endl;
        }
        if (a == "km" && d == "mm")
        {
            // 千米转毫米: 乘以1,000,000
            cout << k << " " << a << " = " << k << "000000 " << d << endl;
        }
        if (a == "m" && d == "mm")
        {
            // 米转毫米: 乘以1000
            cout << k << " " << a << " = " << k << "000 " << d << endl;
        }
        
        // 处理质量单位转换
        if (a == "kg" && d == "g")
        {
            // 千克转克: 乘以1000
            cout << k << " " << a << " = " << k << "000 " << d << endl;
        }
        if (a == "kg" && d == "mg")
        {
            // 千克转毫克: 乘以1,000,000
            cout << k << " " << a << " = " << k << "000000 " << d << endl;
        }
        if (a == "g" && d == "mg")
        {
            // 克转毫克: 乘以1000
            cout << k << " " << a << " = " << k << "000 " << d << endl;
        }
    }
    
    return 0;
}

【运行结果】

2
1 km = ? mm
1 km = 1000000 mm
1 m = ? mm
1 m = 1000 mm
posted @ 2026-01-19 17:16  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报