2024睿抗CAIP-编程技能赛-本科组(省赛)题解

蓝桥杯拿了个省三,天梯没进1队,睿抗是我最后的机会

RC-u4 章鱼图的判断

题目描述

对于无向图 G = ( V , E ) G=(V,E) G=(V,E),我们定义章鱼图为:

有且仅有一个简单环(即没有重复顶点的环),且所有其余边和点都构成附着在该环上的树结构。换言之,是一个环作为“身体”,多个树作为“触手”的连通图。

给定一个无向图,请判断图中是否存在且仅存在一个章鱼子图。


输入格式

  • 第一行是一个正整数 T T T,表示数据的组数, 1 ≤ T ≤ 5 1 \le T \le 5 1T5
  • 每组数据的第一行是两个正整数 N , M N,M N,M,表示图中有 N N N 个顶点和 M M M 条边, 1 ≤ N , M ≤ 1 0 5 1 \le N, M \le 10^5 1N,M105
  • 接下来的 $ M $ 行中,每行包含两个整数 u , v u, v u,v,表示顶点 u u u 与顶点 v v v 之间有一条无向边。
  • 所有顶点编号从 1 1 1 开始。输入中不会包含重复边或自环。

输出格式

对于每组数据,输出一行结果:

  • 如果图中存在且仅存在一个章鱼子图,输出:Yes x,其中 x 是该章鱼图中环的大小(即环中顶点数)。
  • 否则,输出:No y,其中 y 是图中满足章鱼图结构的连通子图个数。

输入样例

3
10 10
1 3
3 5
5 7
7 9
1 2
2 4
2 6
3 8
9 10
1 9
10 10
1 3
3 5
5 7
7 9
9 1
1 2
2 4
4 8
8 10
10 1
10 10
1 3
3 5
5 7
7 9
9 1
2 4
4 8
8 10
10 2
10 6

输出样例

Yes 5
No 0
No 2

第一版 (2 分)

想到并查集,题目理解错了题目要求是 :则在一行中输出 ``Yes 和章鱼子图环的大小(及环中顶点数要求的环的大小,而我第一次直接求的连通分量的大小,所以不该用并查集的,直接暴搜

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int fa[N];
int n, m;int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}int main()
{int k, cnt = 0, num = 0;cin >> k;while(k --){cnt = 0;cin >> n >> m;vector<int> siz(n + 1, 1);for (int i = 0; i <= n +1; i ++)fa[i] = i;for (int i = 1; i <= m; i ++){int a, b;cin >> a >> b;a = find(a);b = find(b);if (a == b) {cnt ++;if (cnt == 1) {num = siz[a];}}else if (a != b){if (siz[a] > siz[b]) swap(a, b);fa[a] = b;siz[b] += siz[a];} }if (cnt == 1) {cout << "Yes" << " " << num << endl;}else{cout << "No" << " " << cnt << endl;}}return 0;}  

正确的思路应该是:

先分出连通块,然后在连通快里面去 dfs 看是不是章鱼图了

第二版(100)

面对这道题可以直接进行搜索,我们先对每个点找到他的连通分量,然后在这个连通分量里面去找有没有环,如果有环,再去这个环中找 环的节点个数

代码加了注释

#include<bits/stdc++.h>
using namespace std;
// 存图 
vector<vector<int>> g; // 从每个节点开始找连通块、连通块中找环的状态数组 
vector<bool> visited, vis2;
// 连通量节点数、父节点、环节点数 
vector<int> comNodes,  parent, circleNodes;// 找到连通分量 
void dfs1(int u)
{visited[u] = true;comNodes.push_back(u);for (int v : g[u]){if (!visited[v]) {dfs1(v);}} } void dfs2(int u , int p)
{vis2[u] = true;for (int v : g[u]){if (v == p) continue;if (!vis2[v]) {parent[v] = u;dfs2(v, u);if (!circleNodes.empty()) return ;} else {// 找到回边(u, v),说明存在一个环int x = u;circleNodes.push_back(v);while (x != v) {circleNodes.push_back(x);x = parent[x];  // 一步一步回找,找出环的节点个数 } return ;}}
}int main()
{int t;cin >> t;while(t --){int n, m;cin >> n >> m;g.assign(n + 1, {});  // 清空 for (int i = 1; i <= m; i ++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}// cnt1:第一个环中的节点数量, // cnt2:表示的是环的数量 int cnt1 = 0, cnt2 = 0; // visited.assign(n + 1, false);for (int i = 1; i <= n; i ++){if (!visited[i]){comNodes.clear();dfs1(i);// 统计顶点数和边数long long sumDeg = 0;for(int u:comNodes)sumDeg += g[u].size();int  V = comNodes.size();int E = sumDeg / 2;  // 无向图// 判断是否是环的条件 if (E == V && V > 2) {cnt2 ++;if (cnt2 == 1) {// 统计第一个章鱼图的环的大小vis2.assign(n + 1, false);circleNodes.clear();parent.assign(n + 1, -1);dfs2(comNodes[0], -1);cnt1 = circleNodes.size(); }} }}if (cnt2 == 1) {cout << "Yes" << " " << cnt1 <<endl;} else {cout << "No" << " " << cnt2 << endl;}}return 0;
}

RC-u3 暖炉与水豚

题目描述

在一个 ( N × M ) (N \times M) (N×M) 的矩阵中,有若干只水豚和若干个暖炉。暖炉可以辐射其中心为中心的 ( 3 × 3 ) (3 \times 3) (3×3) 区域(上下左右斜对角一共9格),使其中的水豚变得暖和。

现在你得到了一个矩阵,其中:

  • "w" 表示暖和的水豚;
  • "c" 表示很冷的水豚;
  • "m" 表示暖炉;
  • "." 表示一个空格(可能是真的空,或者被挡住的暖炉)。

问题:

由于图像被遮挡,最多只有一只水豚的状态是错误的(比如周围没有暖炉却是暖和的),请你判断:

在哪些空格位置放一个暖炉,可以让整个状态变得合法?

一个位置 ((r, c)) 被认为可能藏有暖炉,当在此位置放置暖炉后,所有水豚的状态都与周围暖炉情况一致(至多一处例外)。


输入格式

  • 第一行两个正整数 (N, M) ( ( 1 ≤ N , M ≤ 1000 ) ) ((1 \leq N, M \leq 1000)) (1N,M1000),表示矩阵行列数;
  • 接下来 (N) 行,每行 (M) 个字符,表示矩阵中的内容,字符含义如下:
    • .:空格或疑似空格;
    • c:很冷的水豚;
    • w:暖和的水豚;
    • m:暖炉。

输出格式

输出若干行,每行两个正整数 (r, c),表示该位置可能藏有暖炉。多个可能位置需要按 行号升序、列号升序 输出。

如果没有任何可能位置,输出一行:

Too cold!

输入样例

6 8
wm....mw
.w..ww..
..wm.wwm
w.w....w
.m.c.m..
w.....w.

输出样例

2 7
3 5
4 6
4 7

算法思路

按照题目一步一步模拟即可,先把 c 周围的格子全部标记(不可能藏有火炉),然后枚举 m,把所有 m 周围的 w 都温暖, 最后枚举没有被温暖的 w,火炉就可能藏在它周围。

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
char g[N][N];
bool st[N][N];
int n, m;
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1}; void bfs(int x, int y)
{queue<pair<int, int>> q;st[x][y] = 1;q.push({x, y});while (q.size()){auto t = q.front();q.pop();for (int i = 0; i < 8;i ++){int a = t.first + dx[i];int b = t.second + dy[i];if (a < 1 || b < 1 || a > n || b > m) continue;if (st[a][b]) continue;st[a][b] = 1;}} 
}
int cnt = 0;
bool flag = 1;
signed main()
{cin >> n >> m;// 读图 for (int i = 1; i <= n; i ++)for (int j = 1; j <= m; j ++)cin >> g[i][j];for (int i = 1; i <= n; i ++)for (int j = 1; j <= m; j ++){// 如果是c,说明周围的所有都不能是火炉 if (g[i][j] == 'c'){st[i][j] = 1;for (int k = 0; k < 8; k ++){int a = i + dx[k];int b = j + dy[k];if (g[a][b] == '.') {st[a][b] = 1;g[a][b] = '#';  // 防止后面误判 }}}else if (g[i][j] == 'm'){bfs(i, j); // 把火炉周围的温暖 }}for (int i = 1; i <= n; i ++)for (int j = 1; j <= m; j ++){if (!st[i][j] && g[i][j] == 'w')  // 找到没有被温暖的,火炉可能藏在它周围 {for (int k = 0; k < 8; k++ ){int a  = i + dx[k];int b = j + dy[k];if (g[a][b] == '.'){cout << a << " " << b << endl;flag = 0;  // 说明至少一个隐藏火炉 }}}}if(flag) cout << "Too cold!" ;return 0;
}

RC-u5 工作安排

题目描述

小 K 有 $ N $ 项工作等待完成,每项工作有以下三个属性:

  • t i t_i ti:完成这项工作所需的时间;
  • d i d_i di:这项工作的截止时间(必须在这个时间之前或刚好完成);
  • p i p_i pi:完成这项工作可以获得的报酬。

工作从时间 $ 0 $ 开始,每个时间点只能做一项工作,且工作不可中断、不可切换

目标:

请你帮小 K 规划安排,选择若干项工作,在不违反时间安排的前提下,获得尽可能多的报酬


输入格式

  • 第一行是一个正整数 T T T 1 ≤ T ≤ 5 1 \leq T \leq 5 1T5),表示测试数据的组数;
  • 对于每组数据,第一行是一个整数 N N N 1 ≤ N ≤ 5000 1 \leq N \leq 5000 1N5000),表示工作数量;
  • 接下来的 N N N 行,每行 3 个非负整数 t i , d i , p i t_i, d_i, p_i ti,di,pi(均 ≤ 5000 \leq 5000 5000),表示第 i i i 项工作的耗时、截止时间和报酬。

输出格式

每组数据输出一行,表示在最优安排下小 K 可以获得的最大报酬。


输入样例

3
5
1 2 50
3 3 100
1 5 1
3 2 5000
4 5 30
5
1 2 50
3 3 20
1 5 1
3 2 5000
4 5 30
5
1 2 50
3 3 100
1 5 1
3 2 5000
5 5 800

输出样例

101
80
800

算法思路

尽可能多的获得报酬,很容易想到背包问题,这里 d 是截止时间,那么我们可以用 m 来记录最大的截止时间,然后我们可以把所有物品按照 d 排序,从小到大枚举所有物品就 OK 了

code

#include<bits/stdc++.h>
using namespace std;
const int N  = 5050;
int t[N], d[N], p[N];
int n, m ;
int f[N];struct node
{int t, d, p;
};
node a[N];
bool cmp(node a, node b)
{return a.d < b.d;} 
int main()
{int k;cin >> k;while(k --){m = 0;cin >> n;for (int i = 1;i <= n; i ++){cin >> a[i].t >> a[i].d >> a[i].p;m = max(m, a[i].d); }sort(a + 1, a + 1 + n, cmp);for (int i = 0; i <= m; i ++)f[i] = 0;for (int i = 1;i <= n; i ++){for (int j = a[i].d; j >= a[i].t; j --){f[j] = max(f[j], f[j - a[i].t] + a[i].p);}}int ans = 0;for (int i = 0; i <= m; i++)ans = max(ans, f[i]);cout << ans << endl;}return 0;} 

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

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

相关文章

Java 泛型参数问题:‘ResponseData.this‘ cannot be referenced from a static contex

问题与处理策略 问题描述 Data AllArgsConstructor NoArgsConstructor public class ResponseData<T> {private Integer code;private String msg;private T data;public static final int CODE_SUCCESS 2001;public static final int CODE_FAIL 3001;public static …

用TCP实现服务器与客户端的交互

目录 一、TCP的特点 二、API介绍 1.ServerSocket 2.Socket 三、实现服务器 四、实现客户端 五、测试解决bug 1.客户端发送了数据之后&#xff0c;并没有响应 2.clientSocket没有执行close()操作 3.尝试使用多个客户端同时连接服务器 六、优化 1.短时间有大量客户端访…

鸟笼效应——AI与思维模型【84】

一、定义 鸟笼效应思维模型指的是人们在偶然获得一件原本不需要的物品后,会为了这件物品的配套或使用需求,进而继续添加更多与之相关但自己原本可能并不需要的东西,仿佛被这个“鸟笼”牵着走,最终陷入一种惯性消费或行为模式的现象。简单来说,就是人们在心理上会有一种自…

加密解密记录

一、RSA 加密解密 密钥对生成 1.前端加密解密 &#xff08;1&#xff09;.vue页面引入 npm install jsencrypt&#xff08;2&#xff09;工具 jsencrypt.js import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密钥对生成 http://web.chacuo.net/netrsakeypairconst p…

浅析 MegEngine 对 DTR 的实现与改进

分享笔者在学习 MegEngine 对 DTR 的实现时的笔记。关于 DTR 可以参考&#xff1a;【翻译】DTR_ICLR 2021 文章目录 MegEngine 架构设计MegEngine 的动态图部分Imperative RuntimeImperative 与 MegDNN / MegBrain 的关系静态图运行时管家 —— MegBrain动态图接口 —— Impera…

micro-app前端微服务原理解析

一、核心设计思想 基于 WebComponents 的组件化渲染 micro-app 借鉴 WebComponents 的 CustomElement 和 ShadowDom 特性&#xff0c;将子应用封装为类似 WebComponent 的自定义标签&#xff08;如 <micro-app>&#xff09;。通过 ShadowDom 的天然隔离机制&#xff0c;实…

CMake中强制启用option定义变量的方法

在CMake中&#xff0c;若要在另一个CMake文件中强制启用由option()定义的变量&#xff0c;可使用set(... FORCE)覆盖缓存变量。具体步骤如下&#xff1a; 使用set命令强制覆盖缓存&#xff1a; 在需要强制启用选项的CMake文件中&#xff0c;使用set命令并指定CACHE和FORCE参数。…

C++漫溯键值的长河:map set

文章目录 1.关联式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的应用实践&#xff1a;随机链表的复制 5.multimap希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动…

汽车用品商城小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的汽车用品商城小程序源码&#xff0c;从技术架构来看&#xff0c;ThinkPHP作为后端框架&#xff0c;提供了稳定且高效的开发基础&#xff0c;能够处理复杂的业务逻辑和数据交互。FastAdmin则进一步简化了后台管理系统的开发流程&#xff0c;提…

力扣hot100——114.二叉树展开为链表

基于 Morris 遍历思想 将左子树插到右子树的位置&#xff0c;将原来的右子树插到左子树的最右结点&#xff0c;遍历右结点重复以上步骤&#xff0c;直至右结点为空。 class Solution { public:void flatten(TreeNode* root) {if(rootnullptr) return;while(root){if(!root-&g…

JConsole监控centos服务器中的springboot的服务

场景 在centos服务器中,有一个aa.jar的springboot服务,我想用JConsole监控它的JVM情况,具体怎么实现。 配置 Spring Boot 应用以启用 JMX 在java应用启动项进行配置 java -Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote=true \ -Dcom.sun.managem…

39.RocketMQ高性能核心原理与源码架构剖析

1. 源码环境搭建 1.1 主要功能模块 ​ RocketMQ的官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ​ RocketMQ的官方网站上下载指定版…

施磊老师rpc(一)

文章目录 mprpc项目**项目概述**&#xff1a;深入学习到什么**前置学习建议**&#xff1a;核心内容其他技术与工具**项目特点与要求**&#xff1a;**环境准备**&#xff1a; 技术栈集群和分布式理论单机聊天服务器案例分析集群聊天服务器分析分布式系统介绍多个模块的局限引入分…

基于LangChain构建最小智能体(Agent)实现指南

摘要 本文完整解析基于LangChain的极简Agent实现方案&#xff0c;通过26行代码构建具备网络搜索能力的对话系统&#xff0c;涵盖Agent初始化、工具集成、流式回调等核心技术要点。适用于LLM应用开发者快速入门Agent开发。(参考项目代码&#xff1a;Minimal Agent) 系统架构设计…

AWTK:一键切换皮肤,打造个性化UI

想让你的应用在不同场景下都能完美呈现吗&#xff1f;皮肤切换功能必不可少&#xff01;本文将介绍AWTK&#xff0c;一款强大的GUI框架&#xff0c;它通过内置资源管理和优化缓存&#xff0c;轻松实现皮肤切换功能。 前言 当今的UI应用中&#xff0c;为了满足不同使用场景和…

【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook

文章目录 Vagrant安装vagrant安装 VirtualBox如何使用 Ansible安装AnsiblePlaybook测试创建hosts文件创建setup.yml文件 Vagrant Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动…

AI在医疗领域的10大应用:从疾病预测到手术机器人

AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人摘要引言1. 医学影像诊断&#xff1a;从静态…

Win11 配置 Git 绑定 Github 账号的方法与问题汇总

目录 一、创建 Github 项目库&#xff08;远程仓库&#xff09;二、配置安装好的 Git1. 设置用户信息2. 查看已配置的信息3. 建立本地仓库4. Git 的常用命令1&#xff09;git checkout&#xff08;切换&#xff09;2&#xff09;git push&#xff08;上传&#xff09;3&#xf…

6.应用层

6. 应用层 1. 概述 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分 早期基于文本的应用&#xff08;电子邮件、远程登录、文件传输、新闻组&#xff09;20世纪90年代将因特网带入千家万户的万维…

FPGA 100G UDP纯逻辑协议栈

随着器件等级的升高&#xff0c;高速serdes的线速率也随之提高&#xff0c;RFSOC 4x最大可支持100G&#xff0c;主流方案为RDMA方案&#xff0c;该方案相对比较复杂&#xff0c;除了需要负责逻辑端的开发&#xff0c;还需操作系统中开发RDMA的驱动&#xff0c;对于对丢包不那么…