恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

C++ 题解:最少学习题目数(避免连续相同知识点)

  • 首页
  • 资讯中心
  • /
  • C++ 题解:最少学习题目数(避免连续相同知识点)

相关资讯

我如何解决钻井数据趋势分段难题的 2026/10/8 17:27:14
2026深度体验:我实测豆包工作的办公效率变化 2026/10/8 17:27:14
Context-Mode:LLM上下文管理的四种模式与工程实践 2026/10/8 17:22:13

最新资讯

Claude Code 后台 Fork 中 EndConversation 的 no-op 语义:主对话终结权限边界与福利返回通道解析
如何在10分钟内用EdgeQuake搭建第一个GraphRAG知识图谱:Docker快速上手完整教程
充电桩 APP 开发|用户端 + 运维后台完整功能清单梳理
拍立得TYPEC/USB/UVC/otg安卓摄像头软件免费无广告
SpringBoot闲置物品交易系统源码解析与部署实战
Eros 本地化存储实战:持久化与跨页面数据共享的完整答案

今日推荐

context-mode实战指南:从全量塞入到结构化裁剪与检索增强
大模型对话上下文管理实战:三种模式与Token优化
抖音用户主页视频数据爬虫详解:点赞、收藏、分享字段抓取与 TaoToken 统一 Key 配置

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

C++ 题解:最少学习题目数(避免连续相同知识点)

发布时间:2026/10/8 17:27:14
C++ 题解:最少学习题目数(避免连续相同知识点) 题目分析本题要求小杨在避免连续学习两道相同知识点题目的前提下用最少的题目数量让 m 种算法的掌握程度都至少达到 k。每道题最多学习一次学习第 i 道题可以让第 ai 种算法的掌握程度提高 bi。核心难点在于「连续学习两道相同知识点的题目是不好的」这一约束。这意味着在选出的题目序列中不能出现相邻两项知识点相同的情况。解题思路本题可以采用二分答案 贪心验证的思路二分答案对需要学习的题目数量 x 进行二分判断能否选出 x 道题满足目标。贪心验证对于给定的 x按知识点分组考虑优先选择提升量大的题目并检查是否存在一种排列方式使得相邻题目知识点不同。关键结论设选出题目中数量最多的知识点组有 cnt 道题总题数为 x。若 cnt 超过 (x 1) / 2则无论怎样排列都会出现相邻两道题知识点相同的情况此时无解。因此验证时需保证cnt (x 1) / 2算法步骤对每种算法将其所有题目的提升量 b 从大到小排序。二分答案 x判断是否存在一种选择方案从每种算法中选若干道题总数为 x且每种算法选出的题目提升量之和至少为 k同时满足「最多知识点组数量不超过 (x1)/2」。贪心选取时优先选提升量大的题目若某算法已选题目数过多导致无法满足排列约束则调整选择。参考代码C#include bits/stdc.h using namespace std; int main() { int m, n, k; cin m n k; vectorint a(n), b(n); for (int i 0; i n; i) cin a[i]; for (int i 0; i n; i) cin b[i]; vectorvectorint groups(m 1); for (int i 0; i n; i) { groups[a[i]].push_back(b[i]); } for (int i 1; i m; i) { sort(groups[i].rbegin(), groups[i].rend()); } // 二分答案 int lo 0, hi n, ans -1; while (lo hi) { int mid (lo hi) / 2; // 判断能否选 mid 道题 vectorlong long sum(m 1, 0); vectorint cnt(m 1, 0); int total 0; for (int i 1; i m; i) { int take min((int)groups[i].size(), mid); for (int j 0; j take; j) { sum[i] groups[i][j]; cnt[i]; total; } } if (total mid) { // 题目不够需要从各组中补选 // 这里简化处理若总题数不足 mid则不可行 lo mid 1; continue; } // 检查是否每种算法都达到 k bool ok true; for (int i 1; i m; i) { if (sum[i] k) { ok false; break; } } if (!ok) { lo mid 1; continue; } // 检查排列约束最多组数量不超过 (mid1)/2 int maxCnt 0; for (int i 1; i m; i) maxCnt max(maxCnt, cnt[i]); if (maxCnt (mid 1) / 2) { lo mid 1; continue; } ans mid; hi mid - 1; } cout ans endl; return 0; }复杂度分析时间复杂度O(n log n n log n)排序 O(n log n)二分验证 O(n log n)。空间复杂度O(n m)。总结本题的关键在于将「避免连续相同知识点」转化为排列约束条件即最多知识点组的数量不能超过总题数的一半向上取整。结合二分答案和贪心选取可以在 O(n log n) 时间内求解。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号