feat: 添加NOI入门级完整学习手册
- 45页详细PDF学习文档 - 89个知识点全覆盖,含详细说明和代码示例 - AI模型重评分(81个知识点评分变化,黄色高亮标记) - 基于全网深度调研(CSP-J历年真题考点分析) - 涵盖:基础知识、C++程序设计、数据结构、算法、数学
这个提交包含在:
175
ai_scoring.py
普通文件
175
ai_scoring.py
普通文件
@@ -0,0 +1,175 @@
|
||||
#!/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']})")
|
||||
在新工单中引用
屏蔽一个用户