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

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In