Day3 备战CCF-CSP练习
Day3
题目描述
目前在一个很大的平面房间里有 \(n\) 个无线路由器,每个无线路由器都固定在某个点上。
任何两个无线路由器只要距离不超过 \(r\) 就能互相建立网络连接。
除此以外,另有 \(m\) 个可以摆放无线路由器的位置。
你可以在这些位置中选择至多\(k\) 个增设新的路由器。
你的目标是使得第 \(1\) 个路由器和第 \(2\)个路由器之间的网络连接经过尽量少的中转路由器。
请问在最优方案下中转路由器的最少个数是多少?
输入格式
第一行包含四个正整数 \(n,m,k,r\)。
接下来 \(n\) 行,每行包含两个整数 \(x_i\) 和 \(y_i\),表示一个已经放置好的无线路由器在\((x_i,y_i)\)
点处。输入数据保证第 \(1\) 和第 \(2\) 个路由器在仅有这 \(n\)个路由器的情况下已经可以互相连接(经过一系列的中转路由器)。
接下来 \(m\) 行,每行包含两个整数 \(x_i\) 和 \(y_i\),表示 \((x_i,y_i)\)点处可以增设一个路由器。
输入中所有的坐标的绝对值不超过 \(10^8\),保证输入中的坐标各不相同。
输出格式
输出只有一个数,即在指定的位置中增设 \(k\) 个路由器后,从第 \(1\) 个路由器到第 \(2\)个路由器最少经过的中转路由器的个数。
数据范围
\(2≤n≤100,1≤k≤m≤100,1≤r≤10^8\)
输入样例:
5 3 1 3
0 0
5 5
0 3
0 5
3 5
3 3
4 4
3 0
输出样例:
2
题目分析
\(bfs+dp\) 或 树形\(dp\)
先建图,将可以通信的两点间连线,因为\(n \le 100\) 所以用邻接矩阵存就行
然后对于图上的点来说,有两类,一类是有花费的,另一类是无花费的。
然后我们求走有花费的点的最短路
这道题很像NOIP 2017 普及组T3 棋盘
其实抽象一下,就是类似于有步数限制的单源汇最短路,但不是所有点都有花费
那么我们就得有两个状态,一个是走到点的单源汇最短路,另一个是花费,且最后结果花费要小于\(k\)
由此想到\(dp\)
\(dp(i , j)\)表示走到\(i\)点,花费点为\(j\)的最小步数
那么对于\(dp(i , j)\)能转移的状态就是他的邻接节点,如果该点有花费,那么转移就得是\(j - - 1\)转移到\(j\)即可
至于遍历图,算单源汇最短路,那就很简单了,数据很小,用\(bfs\)就行
注:一共是\(n + m\)个点所以开\(210\)个空间
C++ 代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N = 210;
typedef pair<int, int> PII;
int n , m , k , r;
bool is_cost[N];
PII p[N];
bool st[N][N];
int idx , dp[N][N];
bool g[N][N];
bool check(PII a , PII b)
{
int dist = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
return r >= dist;
}
void bfs()
{
memset(dp , 0x3f , sizeof dp);
dp[1][0] = 0;
queue<PII> q;
q.push({1 , 0});
while(q.size())
{
auto t = q.front();
q.pop();
int ver = t.x , cost = t.y;
if(st[ver][cost]) continue;
st[ver][cost] = true;
for(int i = 1 ; i <= idx ; i ++)
if(g[ver][i] && cost + is_cost[i] <= k && !st[i][cost + is_cost[i]] && dp[i][cost + is_cost[i]] >= dp[ver][cost] + 1)
{
dp[i][cost + is_cost[i]] = dp[ver][cost] + 1;
q.push({i , cost + is_cost[i]});
}
}
}
signed main()
{
cin >> n >> m >> k >> r;
r *= r;
int a , b;
for(int i = 1 ; i <= n ; i ++)
{
cin >> a >> b;
p[++ idx] = {a , b};
is_cost[idx] = false;
}
for(int i = 1 ; i <= m ; i ++)
{
cin >> a >> b;
p[++ idx] = {a , b};
is_cost[idx] = true;
}
for(int i = 1 ; i <= idx ; i ++)
for(int j = i + 1 ; j <= idx ; j ++)
if(check(p[i] , p[j]))
g[i][j] = g[j][i] = 1;
bfs();
int ans = 210;
for(int i = 0 ; i <= k ; i ++)
ans = min(ans , dp[2][i] - 1);
cout << ans << '\n';
}
Day3 备战CCF-CSP练习的更多相关文章
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201703
CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201409-3 字符串匹配
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...
- CCF CSP 201503-3 节日
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...
随机推荐
- 你了解 Java 的类加载器吗?
Java 类加载器(ClassLoader) Java 中的类加载器是用于加载 .class 文件到 JVM 中的组件,它的核心作用是将字节码(.class 文件)加载到内存,并且使它能够被 JVM ...
- Quill自定义插入视频video实例
import Quill from 'quill' const BlockEmbed = Quill.import('blots/block/embed') class VideoBlot exten ...
- 一、Java语言介绍
1.硬件知识介绍 2.常用dos命令以及快捷键 1 /** 2 *@desc: 复习 3 *@Description: 4 * dir:列出当前文件目录下的所有文件; 5 * md:创建一个新目录; ...
- 2025dsfz集训Day2:二分与三分
DAY2:二分与三分 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 二分概述 二分法,在 ...
- 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常. 我们知道 i.MXRT 系列本身并没有片内非易失 ...
- .NET 原生驾驭 AI 新基建实战系列(六):Pinecone ── 托管向量数据库的向量数据库的云原生先锋
引言 随着人工智能和机器学习技术的快速发展,向量数据在许多应用场景中变得越来越重要.从推荐系统到自然语言处理,再到图像搜索,向量搜索技术成为实现高效.精准匹配的核心.Pinecone 作为一个托管的向 ...
- Vue技术之“关于sortable排序的使用”
Vue关于sortable排序的使用 方案1 在使用sortable后要注意给el-table-column中加入prop="overdueDays"参数,不然会找不到需要排序的数 ...
- Nacos源码—6.Nacos升级gRPC分析一
大纲 1.Nacos 2.x版本的一些变化 2.客户端升级gRPC发起服务注册 3.服务端进行服务注册时的处理 4.客户端服务发现和服务端处理服务订阅的源码分析 1.Nacos 2.x版本的一些变化 ...
- Gin 封装原生sql + jwt 实现 web
最近工作之余学了一下 Go 语言, 在此之前是先学了一段时间的 rust, 真的是从入门到放弃, 根本搞不懂, 于是果断转 Go 了, 为啥不继续用 Java 呢, 就是觉得它很啰嗦, 代码量还大, ...
- C语言:高级语言怎样抽象执行逻辑
平时我们做编程的时候,底层 CPU 如何执行指令已经被封装好了,因此你很少会想到把底层和语言编译联系在一起.但从我自己学习各种编程语言的经历看,从这样一个全新视角重新剖析 C 语言,有助于加深你对它的 ...