news 2026/4/23 21:09:10

NOIP 2009 普及组 真题全解(超详细讲解版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NOIP 2009 普及组 真题全解(超详细讲解版)

目录

  1. 多项式输出(模拟 / 字符串处理)
  2. 分数线划定(排序 / 结构体)
  3. 细胞分裂(质因数分解 / 数学)
  4. 道路游戏(线性 DP / 环形处理)

T1 多项式输出

题目链接

洛谷 P1067:https://www.luogu.com.cn/problem/P1067

题意

给出一个一元多项式的次数 n,以及从最高次到常数项的系数。要求按照标准数学格式输出多项式,规则如下:

  • 不输出系数为 0 的项
  • 第一项不输出加号
  • 系数为 1 或 -1 时,不输出 1,只输出符号
  • 一次项只写 x,不写 x^1
  • 常数项直接输出数字

思路讲解

本题是经典模拟题,核心是按项处理、分类讨论

  1. 从高次到常数项依次遍历每一项
  2. 系数为 0 直接跳过
  3. 符号处理:
    • 第一项不输出加号
    • 正数输出 +,负数输出 -
  4. 系数处理:
    • 次数 > 0 且系数绝对值为 1,不输出 1
    • 常数项必须输出数字
  5. 次数处理:
    • 次数 = 0:只输出数字
    • 次数 = 1:只输出 x
    • 次数 ≥ 2:输出 x^ 次数

只要把符号、系数、次数三部分拆开处理,代码就会非常清晰。

完整 AC 代码

#include <iostream> #include <cstdio> using namespace std; int a[110]; int n; int main() { cin >> n; for (int i = 0; i <= n; i++) cin >> a[i]; bool first = true; for (int i = 0; i <= n; i++) { int c = a[i]; int p = n - i; if (c == 0) continue; // 符号 if (c > 0 && !first) cout << "+"; if (c < 0) cout << "-"; int ab = abs(c); first = false; // 系数部分 if (p > 0 && ab != 1) cout << ab; if (p == 0) cout << ab; // x 与指数 if (p > 0) { cout << "x"; if (p > 1) cout << "^" << p; } } return 0; }

T2 分数线划定

题目链接

洛谷 P1068:https://www.luogu.com.cn/problem/P1068

题意

有 n 个选手,给出报名号与成绩。录取名额为 m×1.5(向下取整)。按成绩从高到低排序,同分按报名号从小到大排序。输出:分数线、实际录取人数,再输出所有录取者。

思路讲解

这是最基础的排序题,核心只有两点:

  1. 结构体排序
  2. 排序规则:成绩降序,学号升序

步骤:

  1. 读入所有学生信息
  2. 自定义排序规则
  3. 算出分数线(第 need 名的成绩)
  4. 统计所有 ≥ 分数线的学生
  5. 输出结果

边界注意:

  • 可能有多人同分压线,要全部录取
  • 学号小的优先

完整 AC 代码

#include <iostream> #include <algorithm> using namespace std; struct Stu { int id, score; } s[5010]; bool cmp(Stu a, Stu b) { if (a.score != b.score) return a.score > b.score; return a.id < b.id; } int main() { int n, m; cin >> n >> m; int need = m * 1.5; for (int i = 1; i <= n; i++) cin >> s[i].id >> s[i].score; sort(s + 1, s + n + 1, cmp); int line = s[need].score; int cnt = 0; for (int i = 1; i <= n; i++) { if (s[i].score >= line) cnt++; else break; } cout << line << " " << cnt << endl; for (int i = 1; i <= cnt; i++) cout << s[i].id << " " << s[i].score << endl; return 0; }

T3 细胞分裂

题目链接

洛谷 P1069:https://www.luogu.com.cn/problem/P1069

题意

总试管数 M = m1^m2。有 n 种细胞,第 i 种每秒分裂为 Si 倍。问:最少多少秒后,细胞总数能被 M 整除。若永远不能,输出 -1。

思路讲解

本题考察质因数分解,是数学题而非模拟题。

核心结论:一个数能被 M 整除,当且仅当它包含 M 的所有质因子,且次数足够

步骤:

  1. 对 m1 质因数分解,再乘以 m2,得到 M 的质因子与所需次数
  2. 对每个细胞 Si 质因数分解
  3. 若 Si 缺少 M 的任意一个质因子 → 永远不行
  4. 否则计算每个质因子需要多少秒,取最大值
  5. 所有细胞中取最小时间即为答案

关键点:

  • 必须用质因数分解,不能暴力枚举
  • 次数向上取整:(need + has - 1) /has

完整 AC 代码

#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int INF = 1e9; int pri[300], cnt[300], tot; int m1, m2, n; void divide(int x) { tot = 0; memset(pri, 0, sizeof(pri)); memset(cnt, 0, sizeof(cnt)); for (int i = 2; i * i <= x; i++) { if (x % i == 0) { pri[++tot] = i; while (x % i == 0) { cnt[tot]++; x /= i; } } } if (x > 1) { pri[++tot] = x; cnt[tot] = 1; } for (int i = 1; i <= tot; i++) cnt[i] *= m2; } int solve(int x) { int res = 0; for (int i = 1; i <= tot; i++) { int p = pri[i]; int need = cnt[i]; int has = 0; while (x % p == 0) { has++; x /= p; } if (has == 0) return INF; int t = (need + has - 1) / has; res = max(res, t); } return res; } int main() { cin >> n; cin >> m1 >> m2; if (m1 == 1) { cout << 0 << endl; return 0; } divide(m1); int ans = INF; for (int i = 1; i <= n; i++) { int s; cin >> s; ans = min(ans, solve(s)); } if (ans == INF) cout << -1 << endl; else cout << ans << endl; return 0; }

T4 道路游戏

题目链接

洛谷 P1070:https://www.luogu.com.cn/problem/P1070

题意

环形道路上有 n 个位置,m 个时间单位。每个位置每个时刻会出现金币。机器人可以走 1~k 步,也可以花钱换新机器人。求最大收益。

思路讲解

本题是线性 DP,状态非常清晰:

设dp [i] = 第 i 分钟结束时的最大收益

转移思路:枚举上一次换机器人的时间 j,从 j+1 走到 i,累加金币,减去购买机器人的花费。因为道路是环形,位置要取模处理。

关键点:

  1. 机器人可以连续走,但不能超过 k 步
  2. 每次换机器人都要花钱
  3. 金币只能在对应时间、对应位置获取
  4. 答案是 dp [1…m] 中的最大值

完整 AC 代码

#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; const int INF = 0x3f3f3f3f; int n, m, K; int coin[N][N]; int cost[N]; int dp[N]; int main() { cin >> n >> m >> K; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> coin[i][j]; for (int i = 1; i <= n; i++) cin >> cost[i]; memset(dp, -INF, sizeof(dp)); dp[0] = 0; for (int i = 1; i <= m; i++) { for (int st = 1; st <= n; st++) { int sum = 0; for (int t = 0; t < K && i - t > 0; t++) { int pos = st - t; if (pos <= 0) pos += n; sum += coin[pos][i - t]; if (dp[i - t - 1] != -INF) dp[i] = max(dp[i], dp[i - t - 1] + sum - cost[st]); } } } int ans = 0; for (int i = 1; i <= m; i++) ans = max(ans, dp[i]); cout << ans << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 20:58:17

云手机 云端运行托管

云手机中的云端运行托管主要是指将手机系统运行在云端服务器上&#xff0c;用户无需依赖本地物理设备&#xff0c;通过电脑、平板或其他手机等终端&#xff0c;即可远程连接并操控云端手机。这种模式下&#xff0c;云端手机拥有独立的操作系统、存储空间和网络环境&#xff0c;…

作者头像 李华
网站建设 2026/4/22 20:57:04

这次,库克真的要卸任苹果CEO了!

一水 发自 凹非寺量子位 | 公众号 QbitAI这次&#xff0c;库克真的要卸任苹果CEO了。苹果最新官宣——9月1日&#xff0c;掌权苹果15年的库克&#xff0c;将把CEO一职交棒给现任硬件工程高级副总裁John Ternus。而库克本人&#xff0c;将转居幕后任执行董事长。△图源&#xff…

作者头像 李华
网站建设 2026/4/22 20:57:02

STM32H743开发板机器视觉应用开发指南

1. WeAct STM32H743开发板深度解析WeAct STM32H743是一款基于480MHz STM32H743VIT6 Cortex-M7微控制器的紧凑型开发板&#xff0c;专为嵌入式视觉应用设计。这块板子最吸引人的地方在于它集成了0.96英寸LCD显示屏和摄像头接口&#xff0c;可以直接连接OV系列摄像头模块&#xf…

作者头像 李华
网站建设 2026/4/22 20:57:02

城市 SUV 选胎指南:别盲目换 AT 胎,3 秒找准你的适配胎

很多城市 SUV 车主换胎时&#xff0c;都会被 AT 胎的越野外观吸引&#xff0c;但 90% 的人都陷入了场景匹配错位的误区。核心规律&#xff1a;AT 胎为非铺装路、轻度越野设计&#xff0c;优势是通过性强、抗冲击&#xff1b;但在城市铺装路&#xff0c;会出现胎噪大、油耗高、舒…

作者头像 李华
网站建设 2026/4/22 20:56:17

测试环境管理方案

测试环境管理方案&#xff1a;提升软件质量的关键保障 在软件开发过程中&#xff0c;测试环境是确保产品质量的重要环节。一个高效的测试环境管理方案能够减少资源浪费、提高测试效率&#xff0c;并最终缩短交付周期。许多团队在测试环境管理上仍面临资源冲突、环境不稳定、数…

作者头像 李华
网站建设 2026/4/22 20:53:19

告别百度搜图!手把手教你用ArcGIS 10.5从DEM数据到精准流域掩膜裁剪

告别百度搜图&#xff01;手把手教你用ArcGIS 10.5从DEM数据到精准流域掩膜裁剪 还在为找不到高清流域底图而烦恼&#xff1f;每次处理地形数据都要重新搜索教程&#xff1f;今天我们将彻底解决这两个痛点。不同于网上零散的技巧分享&#xff0c;这里将带您走完从DEM数据获取到…

作者头像 李华