- 45页详细PDF学习文档 - 89个知识点全覆盖,含详细说明和代码示例 - AI模型重评分(81个知识点评分变化,黄色高亮标记) - 基于全网深度调研(CSP-J历年真题考点分析) - 涵盖:基础知识、C++程序设计、数据结构、算法、数学
176 行
5.9 KiB
Python
176 行
5.9 KiB
Python
#!/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']})")
|