cspj2022 T4 上升点列(point)题解(floyd)

news2024/12/23 2:56:55

 样例一:

8 2
3 1
3 2
3 3
3 6
1 2
2 2
5 5
5 3

样例一输出:

8

样例二:

4 100
10 10
15 25
20 20
30 30

样例二输出:

103

一、题目解析:

        平面上有若干个点,若点[i]可以沿着x或y增加方向移动达到点[j],则表示可以从[i]到达[j],否则无法到达。求:所有路径中途经已知点最多且需要添加的路径长度不大于k的。

二、解法分析:

        看一眼数据规模,能用floyd。floyd算法可以求出任意点对之间的最短路径,和题目所求方向一致(筛选一遍就可以)。面临的问题:

1、按题目规则构建图

2、能否以floyd得出的最短路径为依据得出所求

三、数据预处理

1、构建图:

        依题意,ps[i].x<=ps[j].x && ps[i].y<=ps[j].y可以表达能否到达(没有重复点)。

        依题意,符合上述条件时,ps[j].y-ps[i].y+ps[j].x-ps[i].x-1为边权。(自己画一下就知道为啥边权是-1;走不同路线时标出走向,把x增加的映射到x轴,把y增加的映射到y轴,显而易见的按规则行走任何一条[i]到[j]的最短路径长度均相等,这个描述……自己画一下就知道说的是啥了)。

2、dis[i][j]:

        floyd求出的dis[i][j]的意义是点[i]到点[j]的最短路径,1图时画的图形可知:dis[i][j]=点[i]到点[j]经过的空白格子+输入数据占据的格子数。

        故,设kij=ps[j].y-ps[i].y+ps[j].x-ps[i].x-1,有:kij-dis[i][j]为途经的已占据点个数;加上起点[i]、终点[j]即从[i]到[j]最多能经过多少输入占据的格子。

        这里有两个点需要仔细理解:

        a、dis[i][j]表达的是:从[i]到[j]的最短路径,这个路径的总长度是一定的,但是由于部分被输入数据占据了,所以:经过的空白格子越少它就越短,换言之,经过已占据的格子越多,它就越短。

        b、dis[i][j]和k的关系:若一个格子也不经过,则dis[i][j]是a中的特例:途经的都是空白的——全部由k提供。

四、floyd出马:

        分析过程往往是最耗时的,在考试时如果能用上一个“模板”将是多么幸福的事情,尤其像floyd这种短小code想敲错都难的……

        但floyd出马之前,回顾一下上面的分析,计算点[i]到点[j]的距离这个过程需要多处调用,所以function吧:

        

inline long long mathdis(int i,int j){
	//作为边的格子个数 
	return abs(ps[j].x-ps[i].x)+abs(ps[j].y-ps[i].y)-1;
}

        输入数据之后,构建好图(以下代码没有对点排序,所以必须都是1到n全运行一遍,因为无法发保证后输入的点就不能到达先输入的点):

//构建图:能到达的构建一条边
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
				if(i==j){
					dis[i][j]=0;	
				}else{
					if(ps[i].x<=ps[j].x&&ps[i].y<=ps[j].y){
						dis[i][j]=mathdis(i,j);
					}else{
						dis[i][j]=LONG_MAX/2;
					}
				}
		}
	}

        终于轮到弗洛伊德:

//floyd
	for(int p=1;p<=n;p++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][p]+dis[p][j]);
			}
		}
	}

        从mathdis(i,,j)-dis[i][j]中筛选出最大值即可,为了更符合刚才的思维逻辑,直接把起点[i]终点[j]加上:

//扫一遍答案 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			//构成边的空格子总数不大于k 
			if(dis[i][j]<=k){
				//mathdis包括经过的边和点(不含两端),dis仅包含经过的边 
			 	ans=max(ans,mathdis(i,j)-dis[i][j]+2);	//+2包含两端端点 
				//cout<<i<<" - "<<j<<" "<<mathdis(i,j)<<" "<<dis[i][j]<<endl;
			}
		}
	}

最后输出就行了,别忘记ans记录的是:途径点+起点+终点,题目要求的是总长度:

cout<<ans+k<<"\n";

下面就是完整代码……中缺少的定义部分:

const int MXN=505;
struct Point{
	long long x,y;
};
Point ps[MXN+1];
long long n,k,ans,dis[MXN+1][MXN+1];

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

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

相关文章

树的存储结构

双亲存储结构 ● 做法 • 一种顺序存储结构 , 用一组连续空间存储树的所有节点, • 同时在每个节点中附设一个伪指针指示其双亲节点的位置 • 按顺序依次存储 , 逐层逐个节点存储在数组里面 ● 定义存储结构 typedef struct {//定义数据区ElemType data;//指向其双亲在数组中的…

对象的比较(上)PriorityQueue中的底层源码解析

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 问题引入 offer() 扩容 构造方法 grow() siftUp() siftUpComparable&#xff08;&#xff09; 问题引入 问题是这样的&#xff0c…

LeetCode ——160. 相交链表,142. 环形链表 II

✅<1>主页&#xff1a;C语言的前男友 &#x1f4c3;<2>知识讲解&#xff1a;LeetCode经典链表笔试题目 &#x1f525;<3>创作者&#xff1a;C语言的前男友 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f3e1;<5>系统环境&#xff1a;…

机器学习笔记 十八:基于3种方法的随机森林模型分析房屋参数重要性

这里写自定义目录标题1. 探索性数据分析1.1 数据集分割&#xff08;训练集、测试集&#xff09;1.2 模型拟合2. 特征重要性比较2.1 Gini Importance2.2 Permutation Importance2.3 Boruta3. 特征比较3.1 Gini Importance3.2 Permutation Importance3.3 Boruta4. 模型比较将机器…

算法设计与分析复习(一)

判断题&#xff1a; 如果一个NP完全问题能在多项式时间内得到解决&#xff0c;那么NP中的每一个问题都能在多项式时间内求解。&#xff08;T&#xff09;可以用如下方法来证明某结论X成立&#xff1a;先假设X不成立&#xff0c;在此假设基础上推出X成立&#xff0c;则可以证明…

8、Bean的循环依赖问题

8.2 singleton下的set注入产生的循环依赖(解决) A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Husband Data public class …

覆盖变量漏洞

变量覆盖&#xff1a; \> $a 1; $b 2; $a 3; echo $a; > 输出3 .代码从上而下执行&#xff0c;$a被多次定义 常见变量覆盖导致漏洞的函数 \> 经常导致变量覆盖漏洞场景有&#xff1a; $$使用不当 EXTRACT()函数使用不当 PARSE_STR()函数使用不当IMPORT_REQUEST_…

c语言指针(深入了解指针)

前沿&#xff1a; 有人曾说过不会指针等于没有学习c语言&#xff0c;而我也是非常认同这个观点的&#xff0c;要想学习好c语言&#xff0c;指针是比不可缺少的&#xff0c;如果指针学不会c语言也就没办法学好&#xff0c;而向如此越重要的东西越比较难学&#xff0c;但难学并不…

Qt基础之四:Qt信号与槽机制原理及优缺点

信号和插槽用于对象之间的通信。信号和槽机制是Qt的核心特性&#xff0c;可能也是与其他框架提供的特性最大不同的部分。Qt的元对象系统使信号和槽成为可能。 一.简介 在GUI编程中&#xff0c;当我们改变一个控件&#xff0c;通常希望其他控件被通知到。更一般的&#xff0c;…

【优化覆盖】基于matlab果蝇算法求解无线传感器覆盖优化问题【含Matlab源码 2215期】

一、⛄果蝇算法 果蝇优化算法(Fruit Fly Optimization Algorithm, FOA) 是台湾学者潘文超经过研究发现, 并于2011年提出的一种新型智能优化算法, 它具有很好的全局优化性能, 能够解决很多的优化求解问题.果蝇有着优于其它生物的感官知觉, 特别是视觉与嗅觉, 依靠灵敏的嗅觉, 果…

Linux服务器被入侵后的排查思路(应急响应思路)

目录Linux-暴力破解、替换ps命令并留存后门事件复现一、事件背景二、应急响应过程排查crontab后门排查是否有命令被替换响应过程回顾三、事件还原查看后门排查安全日志Linux-暴力破解、替换ps命令并留存后门事件复现 一、事件背景 服务器疑似被入侵&#xff0c;与恶意IP进行通信…

手眼标定笔记

文章目录基本介绍&#xff1a;坐标系变换运算规则&#xff1a;关系运算说明&#xff1a;坐标系运算规则一&#xff1a;坐标系运算规则二&#xff1a;齐次坐标系&#xff1a;齐次坐标系下的坐标变换&#xff1a;眼在手外&#xff1a;眼在手内&#xff1a;解方程&#xff1a;- Ta…

Spring学习第4篇:Spring 的依赖注入

大家家好&#xff0c;我是一名网络怪咖&#xff0c;北漂五年。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深Java选手&#xff0c;深知Spring重要性&#xff0c;现在普遍都使用SpringBoot来开发&#xff0c;面试的时候SpringBoot原理也是经常会问到&…

数据结构 | 单链表

… &#x1f333;&#x1f332;&#x1f331;本文已收录至&#xff1a;数据结构 | C语言 更多知识尽在此专栏中!文章目录&#x1f333;前言&#x1f333;正文&#x1f332;链表打印与销毁&#x1fab4;打印&#x1fab4;销毁&#x1f332;尾部插入与删除&#x1fab4;节点申请&…

javaweb JAVA JSP销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上在线销售

JSP销售系统购物系统jsp购物系统购物商城系统源码&#xff08;jsp电子商务系统&#xff09;网上在线销售

Linux基础 - 虚拟化介绍(KVM)

‍‍&#x1f3e1;博客主页&#xff1a; Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 &#x1f310;所属专栏&#xff1a;『Linux基础』 &#x1f30c;上期文章&#xff1a; Linux基础 - 服务管理&#xff08;systemd&#xff09; &#x1f4f0;如觉得博…

爬取医药卫生知识服务系统的药品数据——超详细流程

爬取医药卫生知识服务系统的药品数据——超详细流程 文章目录爬取医药卫生知识服务系统的药品数据——超详细流程前言一、寻找药品数据二、爬取药品ID1.资源获取2.数据提取3.资源保存4.主函数5.总体代码三、爬取药品信息1.加载资源ID2.获取数据3.数据提取4.保存信息5.主函数6.总…

SpringBoot-属性绑定和bean属性校验

目录 属性绑定 自定义类属性绑定 第三方bean属性匹配 规则:松散绑定&#xff08;宽松绑定&#xff09; Bean属性校验 属性绑定 属性绑定&#xff1a;我们可以使用配置文件对类的属性进行赋值绑定。 自定义类属性绑定 我们自定义一个类&#xff0c;在此使用yml文件进行类…

【滤波器】基于matlab实现微波带低通高通带通滤波器设计

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

python科研做图系列之雷达图

文章目录参考资料matplotlib库画的复现一个 pyecharts的雷达图尝试在上面的基础上&#xff0c;把pyecharts 导出存为一般的png图尝试在上面的基础上&#xff0c;把pyecharts 导出存为一般的矢量图用pygal画雷达图参考资料 参考知乎 CSDN给出了一些参数 matplotbib库雷达图官网 …