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”的形 ...
 
随机推荐
- MySQL 中 int(11) 的 11 表示什么?
			
MySQL 中 int(11) 的 11 表示什么? 在 MySQL 中,int(11) 中的 11 并不表示整数的取值范围,而是用于显示宽度(Display Width).它的含义和具体影响如下: ...
 - kettle+report designer导出带样式的excel包含多个sheet页
			
场景介绍: 运用pentaho report designer报表设计器,查询数据库字典表生成带有样式的excel,通过kettle pentaho报表输出组件导出形成数据字典,最终形成的数据字典样式 ...
 - 查阅相关资料, 了解什么是scrum中的3355?
			
在Scrum中,3355是一个用于描述其核心组成部分的模型,具体包括三个核心角色.三个工件.五个关键事件和五个价值观.下面是对Scrum中3355的详细解释: 三个核心角色 产品负责人(Product ...
 - 《Universal Number Posit Arithmetic Generator on FPGA》(一)
			
A parameterized Verilog HDL is constructed for each unit which takes posit word size (N) and posit e ...
 - EFCore与List的随机算法
			
IQurable<T>,数据库层面的随机,OrderBy(x => EF.Functions.Random()); _coreDbContext.org.OrderBy(x => ...
 - 基础 DP 做题记录
			
Luogu P1192 台阶问题 Link 简要题意: 给定台阶数 \(n\le10^5\) 和一步至多跨越台阶数 \(k\le10^2\) ,初始在 \(0\) 级,求方案数 \(\pmod {10 ...
 - Java编程--简单的Factory程序(工厂设计模式)
			
Factory类不是接口.抽象类,就是普通的类. Factory就像一个工厂一样,可以返回很多对象. 子类在继承.实现抽象类和接口后由Factory类处理,由于子类可能会有多个,Factory根据客户 ...
 - Android去掉默认的标题栏
			
去掉默认的标题栏:在onCreate方法里添加supportRequestWindowFeature(Window.FEATURE_NO_TITLE); @Override protected voi ...
 - Web前端入门第 47 问:CSS @media 媒体查询不要只会视口宽度适配
			
@media 媒体查询的出现解决了什么问题? 曾经,一个网页要兼容移动端和 PC 端,前端的代码复杂度嗖嗖嗖的飙升,需要使用多套代码对各种屏幕尺寸做适配. @media 的出现解决了 CSS 中无法适 ...
 - golang 接口按需获取资源
			
场景 爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装. 当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的 ...