引水入城

最近在搞提高组的题,这是某天早上给的T1

T1最难还行

原题目

1605450-20190710193547979-427459130.png

最近考试考多了就是见题打暴力,打搜索,

然而这题真是搜索,

但是并不能只搜索,会T,没亲测,但一定有效

这并不是考试题,所以看看标签(理直气壮的理由)

1605450-20190710193558254-923896690.png

是BFS啊...

那就用DFS吧

这里的DP一开始看没有什么感觉,但是做着做着发现就是不应该有感觉,这是搜索+贪心啊

下面开始正式题解

首先明白一点,同一个水源可以有不同的目的地,而不同的目的地也可以有着不同的水源,由于这题要求看最少源头或是未通水的目的地数目,所以要对每个水源进行深搜,对能够通水的最后一行的格子进行标记

在来证明一个东西:

不存在源头\(a\)\(b\)左边,但是\(a\)到达的区间在\(b\)所到达的右边,

就像这个图(无视那个\(S_1\)):

1605450-20190710193605257-808692750.png

这个图很明显存在交叉,然而如果两个水源能够到达同一格,那么这个格所能够到达的所有下面的点这两个源头一定都能达到,并不存在交叉非公共部分

那么是否所有的搜索方式都不用网上搜呢?

你考虑这样一种路径就好了(灵魂手绘):

1605450-20190710193613478-569173170.png

注意在进行vis数组标记时,所记录的到过的点只对本次搜索生效,也就是说,本次搜索搜到过的点待会可能别的点也要搜,并且搜到的区间也许更大,这对结构有着更大贡献,,如果因搜到过而停止搜索,会导致代码输出大部分大于答案,所以每次搜索到最后一层是需要用该点的表示列的坐标(由于横纵坐标与本题x,y在本题搞得有点昏,暂且这样称呼,有兴趣自己推吧)对该水源的左右区间端点进行更新

然后处理出每个水源能够到的最左端与最右端,

首先跑一遍最后一列,看有没有最后一行没有到达的格子如果有就是无解,在遍历时统计数量输出即可,

如果全部到达,则用sort函数(按左端点)排一下,并且每次去最长的线段,就是右端点最靠后的线段,当然前提是满足左端点小于上一条线段的右端点(对于第一条线段,其左边的限制是1)

每次将下一条线段的左端点限制更新为r+1,意义自证,

对于每个水源的区间更新,给出以下公式:

\(l_i=min(l_i,y)\)

\(r_i=max(r_i,y)\)

就是对于每个水源\(i\),用每个到达的最后一行的格子列坐标进行更新,当然要的是最左边的\(l\)和最右边的\(r\),分别用\(min\)函数和\(max\)函数取区间

当然,初始化时要把\(l\)赋值成\(inf\)(无穷大),把\(r\)赋值成\(-inf\),来保证区间更新操作的稳定

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define R register
const int inf=0x3f3f3f3f;
int n,m;
int pos[505][505];
struct node{int l,r;node(){l=inf;r=-inf;}
}nd[505];
int mx[6]={0,-1,0,1,0};
int my[6]={0,0,1,0,-1};
bool vis[505][505],final[505];
inline void search(const int &x,const int &y,const int &p){vis[x][y]=1;if(x==n){final[y]=1;nd[p].l=min(nd[p].l,y);nd[p].r=max(nd[p].r,y);}for(R int i=1;i<=4;i++){int nx=x+mx[i];int ny=y+my[i];if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&(!vis[nx][ny])&&(pos[x][y]>pos[nx][ny]))search(nx,ny,p);}
}
inline bool cmp(const node &a,const node &b){if(a.l!=b.l) return a.l<b.l;return a.r<b.r;
}
int main(){scanf("%d%d",&n,&m);for(R int i=1;i<=n;i++)for(R int j=1;j<=m;j++)scanf("%d",&pos[i][j]);for(R int i=1;i<=m;i++)if(pos[1][i-1]<=pos[1][i]&&pos[1][i]>=pos[1][i+1]){memset(vis,0,sizeof vis);search(1,i,i);}int tot=0;for(R int i=1;i<=m;i++)if(!final[i]) tot++;if(tot){printf("0\n%d",tot);return 0;}int num=0;for(R int i=1;i<=m;i++)if(nd[i].l!=inf&&nd[i].r!=-inf){nd[++num].l=nd[i].l;nd[num].r=nd[i].r;}sort(nd+1,nd+1+num,cmp);for(R int l=1,r=0,j=1;l<=m;l=r+1,r=0,tot++){while(nd[j].l<=l){r=max(r,nd[j].r);j++;}}printf("1\n%d",tot);return 0;
}

转载于:https://www.cnblogs.com/648-233/p/11166026.html

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

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

相关文章

程序员必知8大排序3大查找(一)

每天都在叫嚣自己会什么技术&#xff0c;什么框架&#xff0c;可否意识到你每天都在被这些新名词、新技术所迷惑&#xff0c;.NET、XML等等技术固然诱人&#xff0c;可是如果自己的基础不扎实&#xff0c;就像是在云里雾里行走一样&#xff0c;只能看到眼前&#xff0c;不能看到…

最详细的U-BOOT源码分析及移植

本文从以下几个方面粗浅地分析u-boot并移植到FS2410板上&#xff1a; 1、u-boot工程的总体结构 2、u-boot的流程、主要的数据结构、内存分配。 3、u-boot的重要细节&#xff0c;主要分析流程中各函数的功能。 4、基于FS2410板子的u-boot移植。实现了NOR Flash和NAND Flash启动,…

织梦教程

/************************************************************************************************************************************************** 织梦 文件说明 很详细 http://bbs.admin5.com/thread-1952932-1-1.html /****************************************…

TinyXML:一个优秀的C++ XML解析器

2019独角兽企业重金招聘Python工程师标准>>> 读取和设置xml配置文件是最常用的操作&#xff0c;试用了几个C的XML解析器&#xff0c;个人感觉TinyXML是使用起来最舒服的&#xff0c;因为它的API接口和Java的十分类似&#xff0c;面向对象性很好。 TinyXML是一个开源…

《C++标准程序库》学习笔记5 — 第七章

1.(P252) 迭代器的分类及其能力&#xff1a;input迭代器只能读取元素一次。如果复制input迭代器&#xff0c;并使原迭代器和新产生副本都向前读取&#xff0c;可能会遍历到不同的值。output迭代器类似。 2.(P258) C不允许修改任何基本类型&#xff08;包括指针&#xff09;的暂…

Android无线调试——抛开USB数据线

开发Android的朋友都知道&#xff0c;真机调试需要把手机与PC相连&#xff0c;然后把应用部署到真机上进行安装和调试。长长的USB线显得很麻烦&#xff0c;而且如果需要USB接口与其他设备连接的话显得很不方便。今天介绍一种不通过USB线就可以进行真机调试的方法。首先让手机与…

VS2017动态链接库(.dll)的生成与使用

这里以VS2017为例子&#xff0c;讲解一下动态链接库&#xff08;.dll&#xff09;的生成与使用。 一、动态链接库&#xff08;.dll&#xff09;的生成 1、打开&#xff1a;“文件”-“新建”-“项目” 2、打开&#xff1a;“已安装”-“模板”-“Visual C”-“Win32”-“Win3…

Mysql安装后在服务里找不到和服务启动不起来的解决方法

一&#xff0c;在安装完Mysql数据库后&#xff0c;发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下&#xff1a;开启命令行&#xff0c;按照如下步骤即可&#xff1b; 1.进入到mysql的安装包&#xff0c;在bin里执行&#xff1a;mysqld.exe -install …

弹出框

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>AlertBox 弹出层&#xff08;信息提示框&#xff09;效果&l…

easyUI 绑定右键菜单在数据行上显示

easyUI的显示数据的div都有一个样式,如下图 所有的表格都有一个datagrid-cell的样式那么这个时候我们就可以利用jquery来做时间的绑定了 下面是主要的js代码: /*绑定右键*/$(".datagrid-cell").live(contextmenu,function(e){//显示快捷菜单$(#mm).menu(show, {left:…

web前端细解cookie那些事

web前端细解cookie那些事&#xff0c;在互联网时代&#xff0c;IT行业飞速发展&#xff0c;带动了web前端开发行业的兴趣。由于行业新兴起时间不久&#xff0c;专业人才缺乏&#xff0c;薪资待遇较高&#xff0c;已成为众多IT学子选择就业的首选&#xff0c;今天就为分享一些有…

一个C程序的编译过程(Linux环境下Gcc)

一 以下是C程序一般的编译过程&#xff1a; 从图中看到&#xff1a; 将编写的一个c程序&#xff08;源代码 &#xff09;转换成可以在硬件上运行的程序&#xff08;可执行代码 &#xff09;&#xff0c;需要进行编译阶段 和链接这两个阶段。 其中&#xff0c; 1. 编译阶段先通…

Mysql数据导入导出

导出导入数据库导出mysqldump方法mysqldump -u用户名 -p密码名 database [table]> 目标文件导入mysql -uroot -prootuse databasesource 目标文件&#xff1b;PS: 这种方法是导出整个表数据&#xff0c;并且带着建表信息&#xff0c;假如导入的数据库有同名的表&#xff0c;…

Screen Painter 程序设计

一、Screen 的创建及维护, TCode:SE51 输入程序名称&#xff0c;单击【建立】&#xff0c; 程序1000为SAP预留屏幕号&#xff0c;屏幕号必须定义1000外的其他数字&#xff0c;且最多不超过四位&#xff0c; 本例定义屏幕为SAP预留屏幕号为&#xff1a;100 * 属性设置&#xff1…

完全图解VS2017安装过程并演示VS2017创建Linux项目和调试

VS2017个人免费版即社区官方下载地址为&#xff1a;https://download.microsoft.com/download/D/1/4/D142F7E7-4D7E-4F3B-A399-5BACA91EB569/vs_Community.exe 这是一个很小的在线下载安装器。VS2017安装变得人性化了&#xff0c;根据组件的分类&#xff0c;供安装用户选择&…

spring--打印hello--注解component--自动创建对象

1.创建 GroupId----项目目录&#xff08;com.javaspring&#xff09; Artifactid---项目名称(spring01qiuckstart) Version--版本默认 2.默认打开的pom.xml文件 编辑---编写spring核心项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project …

嵌入式C语言之struct内存分配分析

本文源于微信号《嵌入式ARM》。链接&#xff1a;http://mp.weixin.qq.com/s/j2mk6jY79nrJge2cDZVH_A 对结构MyStruct采用sizeof会出现什么结果呢&#xff1f;sizeof(MyStruct)为多少呢&#xff1f; 也许你会这样求&#xff1a;sizeof(MyStruct)sizeof(double)sizeof(char)sizeo…

PostMessage发送字符串和结构体

2019独角兽企业重金招聘Python工程师标准>>> 1.首先定义消息变量 #define WM_POST_MSG WM_USER 2 2.增加消息处理函数 afx_msg LRESULT UpdateStatic(WPARAM wParam, LPARAM lParam); 3.增加消息映射 ON_MESSAGE(WM_POST_MSG,UpdateStatic) 当调用PostMessage函…

SPI、I2C、UART(即串口)三种串行总线详解

以下内容均来源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客 SPI、I2C、UART三种串行总线的原理、区别及应用_嵌入式Linux,的博客-CSDN博客 RS-232 和 UART 之间有什么区别&#xff1f; - 知乎…

用数据辅助设计-搜索中的实践

设计时不能单凭经验和直觉&#xff0c;因为涉及到的目标人群、场景、操作习惯的不同。为了获取更准确、有效的信息去辅助、检测设计&#xff0c;设计师会选择定性&#xff08;用户访谈、焦点小组&#xff09;和定量&#xff08;调研问卷、网站数据分析&#xff09;的方式进行用…