#!/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']})")