1

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

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

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

适合人群:

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

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


编程题

B3871 因数分解

【题目来源】

洛谷:[B3871 GESP202309 五级] 因数分解 - 洛谷

【题目描述】

每个正整数都可以分解成素数的乘积,例如: \(6=2\times 3\)\(20=2^2\times5\)

现在,给定一个正整数,请按要求输出它的因数分解式。

【输入】

输入第一行,包含一个正整数 \(N\)。约定 \(2 \le N \le 10^{12}\)

【输出】

输出一行,为的因数分解式。要求按质因数由小到大排列,乘号用星号 * 表示,且左右各空一格。当且仅当一个素数出现多次时,将它们合并为指数形式,用上箭头 ^ 表示,且左右不空格。

【输入样例】

6

【输出样例】

2 * 3

【算法标签】

《洛谷 B3871 因数分解》 #数论# #GESP# #2023#

【代码详解】

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

#define int long long
const int N = 1005;  // 最大质因子数量
int n;               // 要分解的数
int a[N], b[N];      // a[i]存储第i个质因子,b[i]存储对应的指数
int cur;             // 当前质因子数量

signed main()
{
    // 输入要分解的数
    cin >> n;
    
    // 质因数分解
    for (int i = 2; i * i <= n; i++)  // 只需检查到√n
    {
        if (n % i == 0)  // 如果i是n的因子
        {
            a[++cur] = i;  // 记录质因子
            b[cur] = 0;    // 初始化指数
            
            // 计算指数:不断除以i直到不能整除
            while (n % i == 0)
            {
                b[cur]++;  // 指数加1
                n /= i;    // 除以质因子
            }
        }
    }
    
    // 处理剩余的部分
    // 如果n>1,说明n本身是一个质数
    if (n > 1)
    {
        a[++cur] = n;  // 剩余的n是质因子
        b[cur] = 1;    // 指数为1
    }
    
    // 调试输出
    // for (int i = 1; i <= cur; i++)
    //     cout << a[i] << ' ' << b[i] << endl;
    
    // 格式化输出质因数分解结果
    for (int i = 1; i < cur; i++)  // 前cur-1个因子
    {
        if (b[i] == 1)
        {
            cout << a[i];  // 指数为1,只输出因子
        }
        else
        {
            cout << a[i] << "^" << b[i];  // 指数大于1,输出指数形式
        }
        cout << " * ";  // 因子间用乘号连接
    }
    
    // 输出最后一个因子(不加乘号)
    if (b[cur] == 1)
    {
        cout << a[cur];  // 指数为1
    }
    else
    {
        cout << a[cur] << "^" << b[cur];  // 指数大于1
    }
    
    return 0;
}

【运行结果】

6
2 * 3

B3872 巧夺大奖

【题目来源】

洛谷:[B3872 GESP202309 五级] 巧夺大奖 - 洛谷

【题目描述】

小明参加了一个巧夺大奖的游戏节目。主持人宣布了游戏规则:

  1. 游戏分为 \(n\) 个时间段,参加者每个时间段可以选择一个小游戏。
  2. 游戏中共有 \(n\) 个小游戏可供选择。
  3. 每个小游戏有规定的时限和奖励。对于第 \(i\) 个小游戏,参加者必须在第 \(T_i\) 个时间段结束前完成才能得到奖励 \(R_i\)

小明发现,这些小游戏都很简单,不管选择哪个小游戏,他都能在一个时间段内完成。关键问题在于,如何安排每个时间段分别选择哪个小游戏,才能使得总奖励最高?

【输入】

输入第一行,包含一个正整数 \(n\)\(n\) 既是游戏时间段的个数,也是小游戏的个数。约定 \(1\le n\le500\)

输入第二行,包含 \(n\) 个正整数。第 \(i\) 个正整数为 \(T_i\),即第 \(i\) 个小游戏的完成期限。约定 \(1\le T_i\le n\)

输入第三行,包含 \(n\) 个正整数。第 \(i\) 个正整数为 \(R_i\),即第 \(i\) 个小游戏的完成奖励。约定 \(1\le R_i\le 1000\)

【输出】

输出一行,包含一个正整数 \(C\),为最高可获得的奖励。

【输入样例】

7
4 2 4 3 1 4 6
70 60 50 40 30 20 10

【输出样例】

230

【算法标签】

《洛谷 B3872 巧夺大奖》 #贪心# #GESP# #2023#

【代码详解】

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

const int N = 505;  // 最大任务数

// 任务结构体
struct Node
{
    int r;  // 任务收益
    int t;  // 任务截止时间
} a[N];

int n;    // 任务数量
int ans;  // 最大总收益
bool st[N];  // 标记时间点是否被占用

// 比较函数:按收益降序排序
bool cmp(Node x, Node y)
{
    return x.r > y.r;  // 收益高的排前面
}

int main()
{
    // 输入任务数量
    cin >> n;
    
    // 输入每个任务的截止时间
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].t;
    }
    
    // 输入每个任务的收益
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].r;
    }
    
    // 按收益降序排序
    sort(a + 1, a + n + 1, cmp);
    
    // 贪心算法:为每个任务安排时间
    for (int i = 1; i <= n; i++)  // 按收益从高到低处理任务
    {
        // 从任务的截止时间向前寻找空闲时间点
        for (int j = a[i].t; j >= 1; j--)
        {
            if (!st[j])  // 如果时间点j空闲
            {
                ans += a[i].r;  // 安排任务,累加收益
                st[j] = 1;      // 标记时间点被占用
                break;          // 找到时间点,跳出内层循环
            }
        }
        // 如果没有找到合适的时间点,任务不被安排(收益为0)
    }
    
    // 输出最大总收益
    cout << ans << endl;
    
    return 0;
}

【运行结果】

7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
230
posted @ 2026-01-18 21:50  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报