【Z10】引水入城
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=z10
【题解】
对于第一问:从最上面那m个格子开始进行广搜就可以了;
然后看一下最下面那一行有没有被全部覆盖;
对于第二问:
要先明确;从最上面的那m个格子中的任意一个点开始,在最下面的沙漠中行成的覆盖段一定是连续的一段;(有解的前提下);
证明:
假设最上面的格子x开始进行广搜在最下面形成了两段不连续的区间
a..b c..d (b小于c)
则必然在最上面的m个点中有一个点或多个点,能覆盖b..c这个区间;
但是如果那样覆盖的话,如上图所示,那个点(或多个点)在往下覆盖的时候肯定会和x往下覆盖的路径发生重叠,而既然那个点能往下走,为什么x号节点不能往下走?这就出现矛盾了;所以x格子不可能在最下面形成不连续的两段区间(或多段),则它只能形成一段连续的区间.
则我们在判断完有解之后;
再一个一个地以最上面那个湖泊的点为起点进行广搜,到最下面;看它能覆盖的区间是什么->求出m个区间;
然后用这m个区间进行动规以求覆盖1..m所需要的最少区间数->区间数对应蓄水厂数目;
f[i] = min(f[l[k]-1]+1,f[i]);其中r[k]>=i;
【完整代码】
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
void rel(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void rei(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
const int MAXN = 500+10;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
int n,m;
int a[MAXN][MAXN];
int flag[MAXN][MAXN];
bool bo[MAXN][MAXN];
int tag = 0;
queue <pii> dl;
void bfs()
{
while (!dl.empty())
{
int x = dl.front().fi,y = dl.front().se;
dl.pop();
rep1(k,1,4)
{
int tx = x+dx[k],ty = y+dy[k];
if (bo[tx][ty])
{
if (a[tx][ty]<a[x][y] && flag[tx][ty]!=tag)
{
flag[tx][ty] = tag;
dl.push(mp(tx,ty));
}
}
}
}
}
int main()
{
// freopen("F:\\rush.txt","r",stdin);
memset(bo,false,sizeof(bo));
rei(n);rei(m);
rep1(i,1,n)
rep1(j,1,m)
rei(a[i][j]),bo[i][j] = true;
memset(flag,0,sizeof(flag));
tag++;
rep1(i,1,m)
{
flag[1][i] = tag;
dl.push(mp(1,i));
}
bfs();
int cnt = 0;
rep1(i,1,m)
if (flag[n][i]==0)
cnt++;
if (cnt)
{
puts("0");
printf("%d\n",cnt);
return 0;
}
else
{
vector <pii> a;
rep1(i,1,m)
{
tag++;
flag[1][i] = tag;
dl.push(mp(1,i));
bfs();
pii temp;
rep1(j,1,m)
if (flag[n][j]==tag)
{
temp.fi=j;
break;
}
rep2(j,m,1)
if (flag[n][j]==tag)
{
temp.se = j;
break;
}
a.pb(temp);
}
int f[MAXN],len = a.size();
memset(f,0x3f3f3f3f,sizeof f);
f[0] = 0;
rep1(i,1,m)
rep1(j,0,len-1)
if (a[j].se>=i)
f[i] = min(f[i],f[a[j].fi-1]+1);
puts("1");
printf("%d\n",f[m]);
}
return 0;
}
【Z10】引水入城的更多相关文章
- NOIP2010 引水入城
4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- Luogu 1514 引水入城 (搜索,动态规划)
Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...
- CCF CSP 201703-5 引水入城(50分)
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-5 引水入城 问题描述 MF城建立在一片高原上.由于城市唯一的水源是位于河谷地带的 ...
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
- 洛谷 P1514 引水入城 解题报告
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...
- 洛谷P1514 引水入城 [搜索,区间DP]
题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...
- vijos p1777 引水入城(bfs+贪心)
引水入城 描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
随机推荐
- zendiscovery 的Ping机制
ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到集群的master加入集群.zenDiscovery实现了两种凭机制:广播与单播.本篇将详细分析一些这M ...
- Android Okhttp完美同步持久Cookie实现免登录
通过对Retrofit2.0的<Retrofit 2.0 超能实践,完美支持Https传输>基础入门和案例实践,掌握了怎么样使用Retrofit访问网络,加入自定义header,包括加入S ...
- Redis学习总结和相关资料
因为别人都在用Redis,所以我不得不用Redis. 听起来感觉我很菜的样子,事实上和菜没有关系. 一是由于别人都用,作为后来者,没有"先发"优势,只能顺着别人的思路来做.当前 ...
- 业余学习react 学习记录
http://www.ruanyifeng.com/blog/2015/03/react (阮一峰 react 学习) 1.搭建环境:npm 使用 React npm install -g cnpm ...
- magento getCarriers 分析
完整的设置订单追踪信息的时候我们可能会用到它.在后台中他在这里设置: 有的时候我们想要设置自己定义的 carrier 比如 顺丰 申通 圆通 ..等等 我们能够先从 magento api 入手分析 ...
- 几种基于Java的SQL解析工具的比较与调用
1.sqlparser http://www.sqlparser.com/ 优点:支持的数据库最多,除了传统数据库外还支持hive和greenplum一类比较新的数据库,调用比较方便,功能不错 缺点: ...
- Iptables-主机防火墙设置
基于Iptables构建主机防火墙 Iptables优点: 数据包过滤机制,它会对数据包包头数据进行分析. 1.1.1 加载相关薄块到内核 [root@centos7 ~]# lsmod | egre ...
- Dcloud开发webApp踩过的坑
Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...
- (转)xshell无法在vim中复制黏贴
ssh xshell 连接在vim中无法用 ctrl+insert 复制黏贴 修改.vimrc set mouse=c vi的三种模式:命令模式,插入模式,可视模式.鼠标可以启动于各种模式中: The ...
- (转) 设置sqlplus中的退格键
转自:http://blog.itpub.net/26110315/viewspace-717249/ 有些时候当你使用sqlplus登录到数据库中的时候,敲错了命令想要删除修改的时候,发现以前敲入的 ...