第十一次CCF-CSP(第二题 公共钥匙盒、第四题 通信网络)

2024-03-16 18:52

本文主要是介绍第十一次CCF-CSP(第二题 公共钥匙盒、第四题 通信网络),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十一次CCF-CSP

第二题 公共钥匙盒

原题链接:3248. 公共钥匙盒 - AcWing题库

思路分析

本来我想的是,先不让老师还钥匙,最后一块还。但是很显然这样是不对的。比如:当t=5时刻,钥匙3被还回来,t=6时刻,再次被借走。这种情况下,我的思路就是错的了…

下面说一下正确的思路:

由于既要考虑钥匙被借出去的时刻,又要考虑还回来的时刻。我们不妨建立一个结构体:

struct node
{int a, b;
};	//a 表示钥匙的序号,b 表示钥匙借出去/还回来的时刻
node key1[N], key2[N];	//key1[]表示借出钥匙,key2[]表示还回钥匙

这样一来,我们分别按照时间顺序对key1[] key2[] 进行排序,具体规则如下:

bool cmp(node& x, node& y)
{if (x.b == y.b)return x.a < y.a;return x.b < y.b;
}

然后利用双指针的思想,分别从前往后遍历key1[]key2[] ,且 还钥匙的优先级要高于取走钥匙

代码

#include<bits/stdc++.h>using namespace std;
const int N = 1010;
int n, m;
struct node
{int a, b;
};
node key1[N], key2[N];
int q[N];bool cmp(node& x, node& y)
{if (x.b == y.b)return x.a < y.a;return x.b < y.b;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++)q[i] = i;int a, b, c;for (int i = 1; i <= m; i++){cin >> a >> b >> c;key1[i] = { a,b };	//存放钥匙的序号 和拿走钥匙的时间点key2[i] = { a,b + c };	//存放钥匙的序号 和归还钥匙的时间点}sort(key1 + 1, key1 + 1 + m, cmp);sort(key2 + 1, key2 + 1 + m, cmp);int i=1, j=1;while (i <= m && j <= m){if (key1[i].b < key2[j].b)	//拿走钥匙的时间早于归还的时间 就先拿走{for (int k = 1; k <= n; k++)if (q[k] == key1[i].a){q[k] = 0;break;}i++;}else if (key1[i].b >= key2[j].b)	//当归还时间在前面时,要首先归还{for (int k = 1; k <= n; k++){if (q[k] == 0){q[k] = key2[j].a;break;}}j++;}}while (j <= m){for (int k = 1; k <= n; k++){if (q[k] == 0){q[k] = key2[j].a;// cout<<k<<" ";break;}}
// 		cout<<key2[j].a<<endl;j++;}for (int i = 1; i <= n; i++){cout << q[i] << " ";}return 0;
}



第四题 通信网络

原题链接:3250. 通信网络 - AcWing题库

思路分析

题目的意思就是说,有一个有向图,它有 n 个节点, m条边。要求我们统计符合这样一个条件的节点的个数——从该点出发所能访问的点的个数 加上 从其他点出发能到达该点的个数 的和,恰好是 n 个节点。

既然是有向边,那么前者——该点出发所能访问的点的个数,直接搜索即可。

对于后者——从其他点出发能到达该点的个数,应该如何计算呢?

我们只需要从该点出发,逆向搜索

为了满足我们逆向搜索的目的,就需要我们在建图的时候同时建立一个反向边!但是这样的话,有向边不就变成了无向边了吗?显然这样也是不合理的。

所以我们不妨建立两个图。其中一个存放正向边,另一个存放反向边!

下面看代码:

代码

#include<bits/stdc++.h>using namespace std;
const int N =1010,M=20010;
int h1[N],h2[N],e[M],ne[M],idx;
int n,m;
bool st1[N],st2[N];void add(int h[],int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}void dfs(int x,int h[],bool st[])
{st[x]=1;for(int i = h[x];~i;i=ne[i]){int j = e[i];if(!st[j])dfs(j,h,st);}
}int main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n>>m;memset(h1,-1,sizeof h1);memset(h2,-1,sizeof h2);for(int i = 1;i<=m;i++){int a,b;cin>>a>>b;add(h1,a,b);add(h2,b,a);}int ans=0;for(int i = 1;i<=n;i++){memset(st1,0,sizeof st1);memset(st2,0,sizeof st2);dfs(i,h1,st1);dfs(i,h2,st2);int s = 0;for(int j = 1;j<=n;j++)	//这里表示,以节点 i 为起点进行dfs,从i点能到达的点(正向和反向)是否等于n个节点。{if(st1[j] || st2[j]){s++;}}if(s == n)ans++;}cout<<ans;return 0;
}

反思总结

  • 使用数组模拟邻接表时,一定要记得给h[] 初始化为 -1 !!!!
memset(h1,-1,sizeof h1);
  • 同时建立正向和反向 两个图时,只需要建立两个不同的头结点数组 h[] 就行了。

  • 对于边的数量 M,保险起见,要设置为题目规定大小的 2倍!

  • idx表示序号,大小并不重要。

这篇关于第十一次CCF-CSP(第二题 公共钥匙盒、第四题 通信网络)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816396

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子