第十一次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

相关文章

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

Java通过ServerSocket与Socket实现通信过程

《Java通过ServerSocket与Socket实现通信过程》本文介绍了Java中的ServerSocket和Socket类,详细讲解了它们的构造方法和使用场景,并通过一个简单的通信示例展示了如何... 目录1 ServerSocket2 Socket3 服务器端4 客户端5 运行结果6 设置超时总结1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

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

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

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

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