跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

GESP2025 年 12 月 C++ 七级真题解析:学习小组分组问题

GESP2025 年 12 月 C++ 七级真题“学习小组”问题要求将 n 名学生分为若干组,最大化综合讨论积极度。分数由基础分(取决于组人数)和额外热闹值(组内最大最小积极度之差)组成。解题关键在于先对积极度排序,利用动态规划求解。状态 f[j][k] 表示用 k 名学生分成 j 组的最大得分,通过枚举最后一组人数进行转移。最终输出最大总分。

内存管理发布于 2026/3/27更新于 2026/5/2522 浏览
GESP2025 年 12 月 C++ 七级真题解析:学习小组分组问题

一、原题描述

题目图片

题目图片

二、题目解析

1. 故事背景

班主任要把全班同学分成学习小组。

  • 一共 n 个同学
  • 每个同学都有一个发言积极度
  • 每个学习小组要求:
    • 所有人必须被分进去
    • 不能重叠

2. 分数计算规则

每个学习小组的得分由两部分组成:

(1) 基础讨论积极度

只和小组人数有关。人数是 k,就加 a[k]。

(2) 额外热闹值

小组里最爱说话的同学(最大值)与最不爱说话的同学(最小值)之差。 公式:额外值 = 最大 - 最小

3. 目标

想办法分组,让所有小组的综合讨论积极度之和最大。

4. 示例分析

假设有 4 个同学,编号 1 到 4,积极度分别为 2, 1, 3, 2。 基础分数组 a 为:a[1]=1, a[2]=5, a[3]=6, a[4]=3。

  • 方案一:每人一组

    • [2], [1], [3], [2]
    • 每组基础分 = a[1] = 1,额外值 = 0
    • 总分 = 4
  • 方案二:全班一组

    • [2, 1, 3, 2]
    • 基础分 = a[4] = 3
    • 最大 = 3,最小 = 1,额外 = 2
    • 总分 = 5
  • 方案三:分成两组

    • [2, 1], [3, 2]
    • 第一组:基础 = 5,差值 = 2 - 1 = 1
    • 第二组:基础 = 5,差值 = 3 - 2 = 1
    • 总分 = 12

5. 解题思路

暴力枚举所有分组方式会导致方案数爆炸,因此必须使用动态规划(DP)。

(1) 排序的重要性

在 DP 之前需要先对积极度进行排序:sort(c + 1, c + n + 1)。 排序后,最小值在前,最大值在后,方便计算 最大 - 最小。

核心结论:如果目标是最大化差值,一定要把最小的和最大的放在同一组。中间的人是谁,对差值没有影响。

(2) DP 状态定义

f[j][k] 表示用 k 个同学分成 j 个小组能得到的最大综合讨论积极度。

(3) 状态转移

假设最后一个小组有 i 个人,前面用了 k - i 个同学,前面有 j - 1 个小组。 转移公式:

f[j][k] = max(f[j-1][k-i] + a[i] + (当前组最大值 - 当前组最小值))

其中,当前组的极值可以通过排序后的数组下标直接获取。

6. 完整代码

#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 305;
int n;
int c[N], a[N];
int f[N][N];
int ans;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &c[i]);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    
    sort(c + 1, c + n + 1);
    
    for (int i = n; i >= 1; i--)
        for (int j = 1; j <= n; j++)
            for (int k = i; k <= n; k++) {
                int diff = 0;
                if (i > 1) diff = c[n - j + 1] - c[j];
                f[j][k] = max(f[j][k], f[j - 1][k - i] + a[i] + diff);
                if (k == n) ans = max(ans, f[j][k]);
            }
    
    printf("%d\n", ans);
    return 0;
}

7. 程序说明

  1. 读入同学数和积极度。
  2. 排序(方便算最大最小)。
  3. 三层循环:枚举小组人数、枚举用了多少人、枚举分了多少组。
  4. 用 DP 公式更新答案。
  5. 记录最大值并输出。

8. 知识总结

知识点学会了什么
分组 DP切成一段一段
状态定义f[j][k] 表示什么
排序方便算最大最小
动态规划不重复计算

9. 记忆口诀

分段问题 + 求最大值 = 动态规划 排序 + DP,帮我们抓住'最小与最大'

目录

  1. 一、原题描述
  2. 二、题目解析
  3. 1. 故事背景
  4. 2. 分数计算规则
  5. (1) 基础讨论积极度
  6. (2) 额外热闹值
  7. 3. 目标
  8. 4. 示例分析
  9. 5. 解题思路
  10. (1) 排序的重要性
  11. (2) DP 状态定义
  12. (3) 状态转移
  13. 6. 完整代码
  14. 7. 程序说明
  15. 8. 知识总结
  16. 9. 记忆口诀
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • RNN 与序列数据处理实战:从原理到 LSTM 文本分类
  • 前端无障碍性:让所有人都能使用你的网站
  • 前端视角 | 从零搭建并启动若依后端(环境配置)
  • 基于 Next.js 和 Wagmi 构建支持 TokenP 钱包登录的 DApp 前端
  • 前端框架选型指南:React、Vue 与 Angular 对比分析
  • C++ 核心知识点解析(九)
  • LLaMA-Factory 详细安装与配置指南
  • PX4+ROS 无人机 Offboard 控制:模式解析与实战
  • KingbaseES 内核级 SQL 防火墙:白名单机制与性能实测
  • 使用 Python 和 WinRM 远程控制 Windows 服务器
  • Python EXE 解包工具实战:py2exe 与 pyinstaller 逆向
  • 2025年12月电子学会青少年软件编程Python三级等级考试真题
  • Qwen3Guard-Gen-WEB 全球多语言内容合规部署实测
  • HTML input 类型全解析与实战避坑指南
  • GLM-4.7-Flash 本地 Copilot 工具构建实战教程
  • FPGA 原型验证平台中 Vivado 许可证的动态加载方法
  • 基于Python的轻量级上位机开发流程解析
  • 低空无人机 AI 算法全景:74 种行业场景应用解析
  • 使用 VibeThinker 解决动态规划典型题例
  • 基于 CSANMT 的实时中英对照翻译服务实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online