news 2026/4/17 18:04:11

【例4-13】奖金(信息学奥赛一本通- P1352)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【例4-13】奖金(信息学奥赛一本通- P1352)

【题目描述】

由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。

于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。

【输入】

第一行两个整数n,m,表示员工总数和代表数;

以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。

【输出】

若无法找到合理方案,则输出“Poor Xed”;否则输出一个数表示最少总奖金。

【输入样例】

2 1 1 2

【输出样例】

201

【提示】

【数据规模】

80%的数据满足:n≤1000,m≤2000;

100%的数据满足:n≤10000,m≤20000。

1. 题目背景与分析

核心问题:

公司给员工发奖金,存在M条建议,每条建议形式为:“员工A的奖金必须比B高”。要求满足所有建议,且总奖金数最少。基础奖金为 100 元。

模型转化:

这是一个典型的 “依赖关系” 问题。

如果“A的奖金 >B的奖金”,说明B是A的基础(或者说前驱)。只有确定了B的奖金,才能确定A的奖金。

  • 建图方向:建立一条从B指向A的有向边 (B->A)。

  • 图的性质:这是一个有向无环图。如果存在环(例如 A>B, B>A),则无法满足条件,输出 "Poor Xed"。

  • 目标:在满足拓扑序的前提下,求每个节点的最长路径长度(即层级)。


2. 算法选择:Kahn算法+动态规划

为了让总奖金最少,我们采取贪心策略:每个人只拿“刚好满足条件”的最低工资。

即:w[A]=max(所有前驱的工资) + 1。

为什么选择Kahn算法(入度表法)?

  1. 天然契合:Kahn 算法的核心是不断剥离“入度为0”的点。在本题中,入度为0 代表“没有比他工资更低的人了”,这些人直接拿基础工资 100 元。

  2. 层级递推:随着入度为0的点被移除,它们的后继节点的入度减少。当后继节点入度变为 0 时,说明它的所有下属工资都算好了,此时就可以结算它的工资。

  3. 判环简便:算法结束后,如果还有节点的入度不为0,说明存在环,直接判断无解。


3. 数据结构:邻接表(链式前向星)

由于题目数据范围是N<=10000, M<=20000,属于稀疏图。为了时间和空间效率,本题代码使用了邻接表(链式前向星)来存储图。

相比vector,链式前向星在空间上更紧凑,常数更小。

  • h[u]:存储节点u的第一条边的索引。

  • vtex[i]:第i条边指向的节点。

  • nxt[i]:第i条边的下一条同起点边的索引。


4. 完整代码

//Kahn 时间复杂度:O(N+M) 空间复杂度:O(N+M) #include <iostream> #include <queue> using namespace std; int n,m; int h[10010];//邻接表头指针数组 int vtex[20010];//邻接表第i条边终点的下标 int nxt[20010];//与邻接表第i条边同起点的下一条边的索引 int idx; int din[10010];//记录每个点的入度 int w[10010];//记录第i个员工的奖金 long long sum;//记录总奖金 queue<int> q; void addedge(int a,int b){ vtex[idx]=b; nxt[idx]=h[a]; h[a]=idx++; } int main(){ cin>>n>>m; //初始化邻接表头指针数组为-1 for(int i=1;i<=n;i++) h[i]=-1; //邻接表存边 因为本题点数过多,且为稀疏图 不选邻接矩阵 for(int i=1;i<=m;i++){ int a,b; cin>>a>>b; //第a号员工奖金应该比第b号员工高,就建立一条b->a的边 addedge(b,a); din[a]++;//a入度加一 } for(int i=1;i<=n;i++){//遍历所有员工 if(din[i]==0){//如果入度为0 q.push(i);//就入队 //初始化入度为0的员工,奖金100,因为他们不比任何员工奖金高 w[i]=100; } } while(!q.empty()){ int tmp=q.front();//访问队首元素 q.pop();//队首出队 //接下来访问邻接表找到所有与tmp有边相连的员工 int p=h[tmp]; while(p!=-1){ //a为应比tmp奖金高的员工编号 int a=vtex[p]; //更新a员工的奖金 w[a]=max(w[a],w[tmp]+1); //a员工入度-1 din[a]--; //如果a员工入度为0 就入队 if(din[a]==0) q.push(a); //更新指针 p=nxt[p]; } } //结束后,遍历所有员工,如果存在入度不为0的员工 //代表无法找到合理方案 for(int i=1;i<=n;i++){ if(din[i]!=0){ cout<<"Poor Xed"; return 0; } sum+=w[i];//总奖金 } //否则就输出总奖金 cout<<sum; return 0; }

5. 解题总结

  1. 建图方向

    • 一定要理清谁依赖谁。本题中“A比B高”意味着 A 依赖 B,所以边是B->A。如果建反了,求出来的就是最小值而不是最大值,逻辑会崩盘。

  2. 判环

    • 题目中可能存在矛盾的建议(如 A>B 且 B>A)。Kahn 算法天然支持判环:只要算法结束后还有点没进过队列(即din[i]!=0),就是有环。

  3. 数据类型

    • 虽然每个人奖金可能不多,但总奖金sum可能会超过int范围,使用long long是良好的编程习惯。

  4. 初始化

    • 链式前向星的h数组记得初始化为-1

    • 入度为0的点,初始奖金设为100。

这道题是拓扑排序的经典入门题,理解了它,就理解了“依赖关系解析”的核心逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 17:39:50

LinkAndroid手机连接助手:从入门到精通的完整使用指南

LinkAndroid手机连接助手&#xff1a;从入门到精通的完整使用指南 【免费下载链接】linkandroid Link Android and PC easily! 全能手机连接助手&#xff01; 项目地址: https://gitcode.com/modstart-lib/linkandroid 想要实现手机与电脑的无缝连接&#xff1f;LinkAnd…

作者头像 李华
网站建设 2026/4/11 1:57:40

3D打印太阳能电池实现颜色可调

近期&#xff0c;一项发表于《EES Sol.》&#xff08;2026 年&#xff09;期刊的全新研究&#xff0c;着重介绍了一款具备半透明特性且颜色可调节的钙钛矿太阳能电池。此电池专门设计用于传统面板难以发挥作用的场所&#xff0c;诸如窗户以及柔性表面等。耶路撒冷希伯来大学的研…

作者头像 李华
网站建设 2026/4/13 9:31:56

腾讯HunyuanPortrait:单图生成超自然人像动画!

腾讯HunyuanPortrait&#xff1a;单图生成超自然人像动画&#xff01; 【免费下载链接】HunyuanPortrait 腾讯HunyuanPortrait是基于扩散模型的人像动画框架&#xff0c;通过预训练编码器分离身份与动作&#xff0c;将驱动视频的表情/姿态编码为控制信号&#xff0c;经注意力适…

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

网络安全是什么?手把手教你认识网络安全_什么是网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。 &#xff08;1&#xff09;基本特征 网络安全根据其本质的界定&…

作者头像 李华
网站建设 2026/4/15 16:11:28

基于深度学习YOLOv10的草莓成熟度检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 项目背景: 草莓的成熟度检测在农业生产和采摘过程中具有重要意义。传统的成熟度检测方法主要依赖人工观察&#xff0c;效率低且容易受到主观因素的影响。随着计算机视觉技术的发展&#xff0c;基于深度学习的自动检测方法逐渐成为主流。YOLO&#xff08;You Only…

作者头像 李华
网站建设 2026/4/16 8:39:43

华为OD机试真题精讲:AI处理器组合(Python/Java/C++多语言实现)

华为OD机试真题精讲:AI处理器组合(Python/Java/C++多语言实现) 一、题目描述(2025B卷高频100分题) 题目核心 某AI服务器需搭载组合型处理器,处理器分为 算力型(A) 和 能效型(B) 两种,给定两类处理器的性能参数与约束规则,计算出能最大化服务器总算力的最优处理器…

作者头像 李华