文件
noi-beginner-guide/ai_scoring.py
hao f54affb805 feat: 添加NOI入门级完整学习手册
- 45页详细PDF学习文档
- 89个知识点全覆盖,含详细说明和代码示例
- AI模型重评分(81个知识点评分变化,黄色高亮标记)
- 基于全网深度调研(CSP-J历年真题考点分析)
- 涵盖:基础知识、C++程序设计、数据结构、算法、数学
2026-03-14 08:25:04 -04:00

176 行
5.9 KiB
Python
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
#!/usr/bin/env python3
"""
调用AI模型对NOI入门级知识点进行重新评分
基于全网调研数据CSP-J历年真题考频、难度趋势、2025大纲修订
"""
import json
from openai import OpenAI
client = OpenAI()
# 入门级所有知识点及其原始评分
knowledge_points = """
以下是NOI大纲2025年修订版入门级的所有知识点及其原始难度评级1-5分
请你作为NOI竞赛专家,结合以下调研数据,对每个知识点重新评分。
调研数据:
1. CSP-J历年真题2010-2025考点频率分析
- T1高频模拟法、整数拆分/数位分离、字符串基础、数学
- T2高频模拟、贪心、排序、队列、二分、时间复杂度优化
- T3高频动态规划线性DP/背包DP、数据结构栈/队列/树、BFS/DFS、字符串大模拟
- T4高频DP/图论/树型数据结构、最短路、拓扑排序
2. 近年趋势:难度持续上升,时间复杂度优化成标配,数学思维考察增多
3. DP是CSP-J拉开差距的关键考点
4. 2025年大纲新增了倍增法、差分等知识点
评分维度综合以下4个维度给出1-10分的综合评分
- 考试重要性(考频高=分高)
- 学习难度(越难=分越高)
- 区分度(能拉开差距=分高)
- 实用性(在实际竞赛中的应用广度)
请对以下每个知识点给出:
1. 新的综合评分1-10分
2. 是否与原始评分不同标记changed=true/false
3. 简短的评分理由20字以内
知识点列表(格式:编号 | 知识点名称 | 原始评级):
=== 2.1.1 基础知识与编程环境 ===
1 | 计算机的基本构成 | 1
2 | 操作系统基本概念及常见操作 | 1
3 | 计算机网络和Internet基本概念 | 1
4 | 计算机的历史和常见用途 | 1
5 | NOI相关活动的历史与规则 | 1
6 | 位、字节与字 | 1
7 | 程序设计语言及编译运行基本概念 | 1
8 | 文件/目录的图形界面操作 | 1
9 | Windows/Linux集成开发环境使用 | 1
10 | 编译命令g++的基本使用 | 1
=== 2.1.2 C++程序设计 ===
11 | 标识符、关键字、常量、变量、表达式 | 1
12 | 常量与变量的命名、定义及作用 | 1
13 | 头文件与名字空间 | 2
14 | 编辑、编译、解释、调试概念 | 2
15 | 基本数据类型(int,long long,float,double,char,bool) | 1
16 | 输入输出语句(cin/cout/scanf/printf) | 2
17 | 条件语句(if/switch) | 2
18 | 循环语句(for/while/do while) | 2
19 | 多层循环语句 | 3
20 | 算术/关系/逻辑运算 | 1
21 | 位运算 | 2
22 | 数学库常用函数 | 3
23 | 顺序/分支/循环结构 | 1
24 | 模块化程序设计与流程图 | 2
25 | 数组与数组下标 | 1
26 | 二维数组与多维数组 | 3
27 | 字符数组与string类 | 2
28 | 函数定义与调用、递归函数 | 2
29 | 传值与传引用参数 | 3
30 | 结构体与联合体 | 3
31 | 指针与引用 | 4
32 | 文件读写 | 2
33 | STL常用函数(min/max/swap/sort) | 3
34 | STL容器(stack/queue/list/vector) | 4
=== 2.1.3 数据结构 ===
35 | 链表(单/双向/循环) | 3
36 | 栈 | 3
37 | 队列 | 3
38 | 树的定义与基本概念 | 3
39 | 二叉树定义与基本性质 | 3
40 | 树/二叉树的表示与存储 | 4
41 | 二叉树的遍历(前序/中序/后序) | 4
42 | 完全二叉树定义、性质与数组表示 | 4
43 | 哈夫曼树与哈夫曼编码 | 4
44 | 二叉搜索树 | 4
45 | 图的定义与相关概念 | 3
46 | 图的存储(邻接矩阵/邻接表) | 4
=== 2.1.4 算法 ===
47 | 算法概念 | 1
48 | 算法描述(自然语言/流程图/伪代码) | 2
49 | 枚举法 | 1
50 | 模拟法 | 1
51 | 贪心法 | 3
52 | 递推法 | 3
53 | 递归法 | 4
54 | 二分法 | 4
55 | 倍增法 | 4
56 | 前缀和 | 3
57 | 差分 | 4
58 | 高精度运算 | 4
59 | 排序基本概念 | 3
60 | 冒泡排序 | 3
61 | 选择排序 | 3
62 | 插入排序 | 3
63 | 计数排序 | 3
64 | 深度优先搜索(DFS) | 5
65 | 广度优先搜索(BFS) | 5
66 | 图的深度优先遍历 | 4
67 | 图的广度优先遍历 | 4
68 | 泛洪算法(Flood Fill) | 5
69 | 动态规划基本思路 | 4
70 | 简单一维动态规划 | 4
71 | 简单背包类型动态规划 | 5
72 | 简单区间类型动态规划 | 5
=== 2.1.5 数学与其他 ===
73 | 自然数/整数/有理数/实数及运算 | 1
74 | 进制与进制转换 | 1
75 | 代数(初中部分) | 1
76 | 几何(初中部分) | 1
77 | 整除/因数/倍数/质数/合数 | 3
78 | 取整 | 3
79 | 模运算与取余 | 3
80 | 整数唯一分解定理 | 3
81 | 辗转相除法(欧几里得算法) | 3
82 | 素数筛法(埃氏筛/线性筛) | 4
83 | 集合 | 2
84 | 加法原理 | 2
85 | 乘法原理 | 2
86 | 排列 | 4
87 | 组合 | 4
88 | 杨辉三角 | 4
89 | ASCII码 | 2
请以JSON格式返回,格式如下
[
{"id": 1, "name": "知识点名称", "original_score": 1, "new_score": 2, "changed": true, "reason": "评分理由"},
...
]
"""
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": "你是NOI竞赛评分专家。请严格按照JSON格式返回评分结果。"},
{"role": "user", "content": knowledge_points}
],
temperature=0.3,
max_tokens=8000
)
result = response.choices[0].message.content
# Extract JSON from response
if "```json" in result:
result = result.split("```json")[1].split("```")[0]
elif "```" in result:
result = result.split("```")[1].split("```")[0]
scores = json.loads(result)
# Save to file
with open('/home/ubuntu/ai_scores.json', 'w', encoding='utf-8') as f:
json.dump(scores, f, ensure_ascii=False, indent=2)
# Print summary
changed_count = sum(1 for s in scores if s.get('changed', False))
print(f"总共评分 {len(scores)} 个知识点")
print(f"其中 {changed_count} 个知识点评分发生了变化")
print("\n评分变化的知识点:")
for s in scores:
if s.get('changed', False):
print(f" [{s['id']}] {s['name']}: {s['original_score']} -> {s['new_score']} ({s['reason']})")