一本通 3.4.6 拓扑排序

news2024/9/25 10:39:53

1352:【例4-13】奖金

【题目描述】

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

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

【题目分析】

如果a的奖金比b的奖金多,让b指向a,a的入度加1,使用广度优先搜索进行拓扑排序的查找,如果没有入度为0的点则不能找到答案,对拓扑输出点进行计数,不等于n也不能找到答案,初始化入度为0的点奖金为100,后续的拓展点奖金都比前面的点大1,队列弹出时将奖金加和,最后的结果为和。

【代码实现】

#include <bits/stdc++.h>

using namespace std;

struct node {
	int x, money;
};

vector<node> p[10005];
int indeg[10005];
queue<node> que;

int main() {
	//input data
	int m, n;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		p[y].push_back({x, 0});
		indeg[x]++;
	}
	for (int i = 1; i <= n; i++) {
		if (indeg[i] == 0)
			que.push({i, 100});
	}
	if (que.empty()) {
		cout << "Poor Xed" << endl;
		return 0;
	}
	int cnt = 0, sum = 0;
	while (!que.empty()) {
		node fa = que.front();
		que.pop();
		for (auto e : p[fa.x]) {
			if (--indeg[e.x] == 0) que.push({e.x, fa.money + 1});
		}
		cnt++;
		sum += fa.money;	
	}
	if (cnt != n) cout << "Poor Xed" << endl;
	else cout << sum << endl;
	return 0;
}

1395:烦人的幻灯片(slides)

【题目描述】

李教授将于今天下午作一次非常重要的演讲。不幸的事他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起。因此,演讲之前他不得不去整理这些幻灯片。作为一个讲求效率的学者,他希望尽可能简单地完成它。教授这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1~n编了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。

现在我们用大写字母A,B,C……再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们称对应是无法实现的。

【题目分析】

题目分析:根据幻灯片的坐标范围可以确定每一张幻灯片的可能多个位置,本题的实质是求解一种可能的组合。

样例解释:A可能为1 2 4,B可能为1 3,C可能为1 2 3,D可能为3,首先D的入度为1,去掉3以后,B的入度为1,再去掉1以后,C的入度为1,再去掉2,A的入度为1
算法实现:vis[]标记有效的数值编号,encode[]记录字母对应的编号,point[]记录每个字母指向的可能数值编号,统计出度为1的字母,找到该字母对应的编号记录到encode中,并将对应数字编号标记为无效,检查所有其他字母去掉该数字编号的入度是否为1,依次循环,统计循环次数是否为n,不为n说明无法确定顺序

【代码实现】

#include <bits/stdc++.h>

using namespace std;

bool vis1[30], vis2[30];
int encode[30];
int indeg[30];
vector<int> p[30];

struct node {
	int xmin, xmax, ymin, ymax;
} huan[30];


int main() {
	//input data
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> huan[i].xmin >> huan[i].xmax >> huan[i].ymin >> huan[i].ymax;
	}

	for (int j = 1; j <= n; j++) {
		int x, y;
		cin >> x >> y;
		for (int i = 1; i <= n; i++) {
			if (x >= huan[i].xmin && x <= huan[i].xmax && y >= huan[i].ymin && y <= huan[i].ymax)
				p[i].push_back(j), indeg[i]++;
		}
	}
	int cnt = 0;
	for (int j = 1; j <= n; j++) {
		for (int i = 1; i <= n; i++) {
			if (indeg[i] == 1) {
				for (auto e : p[i])
					if (vis1[e] == 0) encode[i] = e, vis1[e] = 1, vis2[i] = 1, cnt++;
			}
		}
		memset(indeg, 0, sizeof(indeg));
		for (int i = 1; i <= n; i++) {
			if (vis2[i] == 1) continue;
			for (auto e : p[i]) {
				if (vis1[e] == 0) indeg[i]++;
			}
		}
	}

	if (cnt != n) cout << "None" << endl;
	else {
		char c = 'A';
		for (int i = 1; i <= n; i++) {
			printf("%c %d\n", c + i - 1, encode[i]);
		}
	}
	return 0;
}

1396:病毒(virus)

【题目描述】

有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母。

现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档。

现在你的任务是:告诉你被病毒感染了的字典,要你恢复一个字母串。

【题目分析】

因为这k个字符串原本是按字典序排列的,所以是有序的;被病毒感染只会改变原来字符串的样子,但并不会影响原来的排序!
所以我们可以根据这k个字符串得出原字符x和感染后的字符y之间的对应关系!(可以理解为一一对应的映射关系)
怎么找到这种映射关系?
这里我想到的做法是:双层循环+逐位查询+拓扑排序
说白点就是先模拟字典序排序的过程:如果两个字符串的第i位相等,则判断第i+1位,直到其中一个字符串完结
在这个过程中我们找到一个两个字符不同的位置,就进行连边和入度累加的操作,之后使用拓扑排序便能得到映射关系
怎么想到的拓扑排序?
先通过模拟字典序排序过程,我们可以得到如下的字符大小序列:c<e<d<a<b
 和 e<a那么映射关系即:c−>a,e−>b,d−>c,a−>d,b−>e
(注意箭头前的是被感染后的字符,箭头后的是原始字符)c<e<d<a<b这个即是拓扑序列!然后根据这个拓扑序列我们就能够找到映射关系!

【代码实现】

#include <bits/stdc++.h>
using namespace std;
int n,tot;
int f[30],G[30][30],v[30],res[30],h[30];
//f记录入度,G记录前后,v记录是否入队,res中转,h记录对应顺序
string s[50010];
stack<int> r;
int main()
{
    memset(f,0x3f,sizeof(f));
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    for(int i=1;i<n;i++){
        if(s[i]==s[i+1]) //完全相同,下一个
			continue;
        if(s[i+1].find(s[i])==0) //后一个包含前一个,没有比较的意义
			continue;
        if(s[i].find(s[i+1])==0){//前一个包含后一个,字典错误(与上一个相反)
		    puts("0"); 
			return 0; 
		}
        int x=0;
        while(s[i][x]==s[i+1][x]) //寻找不同字母
			x++;
        int a=s[i][x]-'a'+1,b=s[i+1][x]-'a'+1;
        if(G[b][a]){ //这里a在b前,而之前b在a前,前后矛盾,字典错误,结束
		    puts("0"); 
			return 0; 
		}
        G[a][b]=1;//存储
        if(!v[a]) v[a]=1,f[a]=0;
        if(!v[b]) v[b]=1,f[b]=1;
        else f[b]++;//入度加一
    }
    memset(v,0,sizeof(v));
    for(int i=1;i<30;i++) 
		if(!f[i]) 
			r.push(i),v[i]=1;
    while(r.size()) {//拓扑排序
        int x=r.top(); r.pop();
        res[++tot]=x;//记录当前
        for(int i=1;i<30;i++) {
            if(G[x][i]) f[i]--;//入度减一
            if(!f[i]&&!v[i]) 
				r.push(i),v[i]=1;
        }
    }
    for(int i=1;i<=tot;i++) 
		h[res[i]]=i;
    string que,ans; //que是被感染的字符串,ans是答案
	cin>>que;
    for(int i=0;i<que.length();i++) {
        if(!h[que[i]-'a'+1]){//字典不完整,找不到对应字符
		    puts("0"); 
			return 0;
		}
        ans+=(char)(h[que[i]-'a'+1]+'a'-1);//记录答案
    }
    cout<<ans<<endl;
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler实验-基于openEuler的云景平台文件管理系统

一些常见的Linux命令 目录 前言 实验目的 实验内容 实验知识点 实验环境 实验分析 系统登录和电源管理 1&#xff09;使用login命令登录系统 2&#xff09;退出openEuler 3&#xff09;退出当前的shell 软件管理 1&#xff09;查询目录信息 2&#xff09;切换目录路…

基于Tensorflow搭建卷积神经网络CNN(服装分类)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现服装的分类识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠&#xff0c;然后经过全连接层&#xff0c;最后用softmax映射为每个类别的概率&#xff0c;概率最大的即为识…

25 - 回文串问题

文章目录 1. 回文子串法一&#xff1a;动态规划法二&#xff1a;双指针法 2. 最长回文子串方法一&#xff1a;动态规划法方法二&#xff1a;双指针法 3. 最长回文子序列 1. 回文子串 法一&#xff1a;动态规划 递推公式 当s[i] ! s[j]&#xff0c;那没啥好说的了&#xff0c;d…

三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?

曾被中金公司称为“中国大消费最燃赛道”的中式餐饮&#xff0c;正在密集掀起IPO的风潮。去年5月和7月&#xff0c;老乡鸡和老娘舅分别向上交所提交招股书&#xff0c;绿茶餐厅、杨国福麻辣烫、捞王等企业也在推进上市计划。 国内第四大中式快餐集团&#xff0c;占据约0.6%市场…

python版pytorch模型转openvino及调用

一、openvino安装 参看官方文档https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html 安装命令是根据上面的选择生成。这里安装了pytorch和onnx依赖。 二、pytorch模型转opnvino模型推理 import os import time import cv2 import nu…

易基因:MeRIP-seq等揭示m6A甲基化修饰对抗病毒基因表达的转录调控机制|Cell Rep

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2021年03月02日&#xff0c;杜克大学医学中心的分子遗传学和微生物学系Stacy M. Horner教授团队在《Cell Reports》&#xff08;IF: 9.995&#xff09;杂志发表了题为“Post-transcripti…

LeetCode算法小抄--归并排序详解及应用

LeetCode算法小抄--归并排序详解及应用 归并排序详解及应用[912. 排序数组](https://leetcode.cn/problems/sort-an-array/)[315. 计算右侧小于当前元素的个数](https://leetcode.cn/problems/count-of-smaller-numbers-after-self/)[hard]--华为笔试[493. 翻转对](https://lee…

Java版本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

供应链优化的好处是什么?

企业可以从优质的供应链优化软件中获得许多好处&#xff1a; 成本降低 通过供应链优化&#xff0c;可以消除许多不必要的成本&#xff0c;从而简化业务运营费用。所有重复或无效的流程也可以根据需要消除或自动化。重点可以转移到通过准确及时交付来满足客户的需求上。通过供…

OpUtils网络端口扫描

网络端口扫描程序使 IT 管理员能够密切监视端口&#xff0c;这些端口是网络通信的端点。网络端口支持不同实体之间的数据传输&#xff0c;并支持运行各种服务或应用程序。在日常工作中&#xff0c;网络管理员的任务是扫描和监控数百个交换机端口。网络端口扫描程序工具通过帮助…

Intellij IDEA-插件开发环境搭建

插件开发有两种方式 1.基于Gradle&#xff08;新版IDEA&#xff0c;按钮名称叫做IDE Plugin&#xff0c;具体多新我也不清楚&#xff0c;反正2023的必须是这种&#xff09; 2.基于Dev kit&#xff08;旧版IDEA&#xff0c;按钮名称叫做IntelliJ Platform Plugin&#xff0c;具体…

【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透

前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理, Gitlab主要针对…

基于Udacity模拟器的端到端自动驾驶决策

1 端到端自动驾驶决策 端到端自动驾驶决策的输入为车辆的感知信息&#xff0c;如摄像头信息&#xff0c;输出为车辆的前轮转角和摄像头等信息。 如上图所示&#xff0c;为英伟达公司的端到端自动驾驶决策框架&#xff0c;其CNN网络如下图所示&#xff0c;其中包括一个归一化…

狂神说Docker

思维导图&#xff1a; 文章目录 1.Docker概念与安装1.1 概述1.2 安装1.3 卸载1.4 Docker的执行镜像原理1.5 Docker为什么比Vm快1.6 Docker底层原理 2.Docker常用命令2.1 帮助命令2.2 镜像命令2.3 容器命令2.4 其他常用命令 3.小练习3.1 Docker下安装Nginx3.2 Docker安装Tomcat…

[网络安全提高篇] 一二〇.恶意软件动态分析经典沙箱Cape批量提取动态API特征

终于忙完初稿,开心地写一篇博客。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究…

SpringBoot设计了哪些可拓展的机制?

SpringBoot核心源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { ...this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// Servletthis.webApplicationType WebApplicationType.deduceFromClass…

sentinel配置文件

转载自 https://blog.csdn.net/u012441222/article/details/80751390 Redis的哨兵机制是官方推荐的一种高可用&#xff08;HA&#xff09;方案&#xff0c;我们在使用Redis的主从结构时&#xff0c;如果主节点挂掉&#xff0c;这时是不能自动进行主备切换和通知客户端主节点下…

涨点神器:基于Yolov8小目标遮挡物性能提升(SEAM、MultiSEAM)

1.遮挡物检测简介 不同的目标检测应用场景有不同的检测难点,小目标、多尺度以及背景复杂等问题,被遮挡的物体仍然是最先进的物体检测器面临的挑战。本文尝试解决待测目标相互遮挡带来的检测困难,对于人脸遮挡提出了一个名为 SEAM 的注意力模块并引入了排斥损失来解决它,引…

机器学习入门实例-加州房价预测-3(选择与训练模型+调参)

选择与训练模型 使用线性回归 from sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_errorlin_reg LinearRegression()lin_reg.fit(housing_prepared, housing_labels)housing_predictions lin_reg.predict(housing_prepared)lin_ms…

直播预告 | TDengine Apache SeaTunnel 联合应用最佳实践

TDengine 自诞生之日起&#xff0c;除产品层面的技术创新和实力提升外&#xff0c;也在大力完善自身产品生态&#xff0c;以此进一步满足用户的业务需求、提升使用体验。 近日&#xff0c;TDengine 与 Apache SeaTunnel 展开集成合作&#xff0c;双方将于 4 月 18 日 19:00 联…