http://www.rqnoj.cn/problem/601

今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发。

要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市怎么都覆盖不到,就输出覆盖不到的城市数。

这样,最上面的城市能覆盖的最下面的城市一定是一个区间,不会从中间断开。因为如果断开了,那断开的这一部分怎么都没有水能流到了,可以按照覆盖不到处理。当全部能覆盖到的时候,才要用这些区间来算最小需要多少个起点城市,有覆盖不到的就不用这些区间了。居然,好像说得很复杂,就是有覆盖不到的点,记这些区间就没什么用,记错了也没关系;如果没有覆盖不到的点,这些区间就是对的。

这个部分我用q[i][j].l和q[i][j].r记录[i][j]点能达到的区间[l,r]。深搜,搜到底端节点就

q[x][y].l=min(q[x][y].l , y);
q[x][y].r=max(q[x][y].r , y);
can++;

can记录的是能到达的城市的数量,用来统计有没有城市到不了的。
因为如果(x,y)这个点能到的区间算好了之后,能到达(x,y)的点肯定包含这个区间,就不用再进入(x,y)点再算一遍区间了,直接加上这个区间就好。这样,每个点就只用进入一次。一下就能深搜完啦。

然后q[0][i].l和q[0][i].r就记录了第一行的i号节点能到的区间,接下来就是最小区间覆盖了。

以前我用的是DP,f[i]记录从(n,1)到(n,i)这个区间所需要的最少起点城市数。

    f[]:=;
for i:= to m do{从[1,1]区间开始,到[1,2]区间,不断延伸,直到[1,m]区间}
begin
f[i]:=;
for j:= to m do
if (e[,j].l<=i)and(e[,j].r>=i)then
f[i]:=min(f[i],f[e[,j].l-]+);
end;

这是pascal代码,碉不碉。

然后我今天看到最小区间覆盖竟然是贪心…

每次找到包含起始节点s(这题里是0)的r最大的区间,加入结果区间里,然后s=r+1,重复直到s>=m,就覆盖完了…

AC代码:

 #include<iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define MAXN 555
#define RE freopen("in.txt","r",stdin); using namespace std; const int dx[]= {,,-,};
const int dy[]= {-,,,};
const int inf=; struct Qujian
{
int l,r;
}; bool cmp(Qujian x,Qujian y)
{
return x.r>y.r;
} int n,m,can;
int a[MAXN][MAXN];
Qujian q[MAXN][MAXN];
bool w[MAXN][MAXN]; int farm();
void init(); int main()
{
//RE
while(scanf("%d%d",&n,&m)!=EOF)
{
farm();
}
return ;
} void dfs(int x,int y)
{
int i,j,nx,ny;
if(w[x][y]) return;
w[x][y]=true;
if(x==n-)
{
q[x][y].l=min(q[x][y].l , y);
q[x][y].r=max(q[x][y].r , y);
can++;
}
for(i=; i<; i++)
{
nx=x+dx[i];
ny=y+dy[i];
if(nx< || ny< || nx>=n || ny>=m) continue;
if(a[nx][ny]>=a[x][y]) continue;
if(!w[nx][ny]) dfs(nx,ny);
q[x][y].l=min(q[x][y].l , q[nx][ny].l);
q[x][y].r=max(q[x][y].r , q[nx][ny].r);
}
} int farm()
{
int i,j;
init();
for(i=; i<n; i++)
for(j=; j<m; j++)
{
scanf("%d",&a[i][j]);
}
for(i=; i<m; i++)
dfs(,i);
// for(i=0; i<n; i++)
// {
// for(j=0; j<m; j++)
// cout<<'['<<q[i][j].l<<','<<q[i][j].r<<"] ";
// cout<<endl;
// }
if(can<m)
{
printf("0\n%d\n",m-can);
}
else
{
sort(q[],q[]+m,cmp);
i=;
int ans=;
while(i<m)
{
for(j=; j<m; j++)
if(q[][j].l<=i)
{
i=q[][j].r+;
ans++;
break;
}
}
printf("1\n%d\n",ans);
} return ;
} void init()
{
int i,j;
memset(q,,sizeof(q));
can=;
for(i=; i<n; i++)
for(j=; j<m; j++)
q[i][j].l=inf;
memset(w,false,sizeof(w));
}

NOIP2010 引水入城 题解的更多相关文章

  1. 521. [NOIP2010] 引水入城 cogs

    521. [NOIP2010] 引水入城 ★★★   输入文件:flow.in   输出文件:flow.out   简单对比时间限制:1 s   内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...

  2. luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)

    P1514 引水入城  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  3. NOIP2010 引水入城

    4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...

  4. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  5. [NOIP2010] 引水入城 贪心 + 记忆化搜索

    ---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...

  6. NOIP2010引水入城[BFS DFS 贪心]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  7. noip2010 引水入城 bfs+贪心

    如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...

  8. Luogu1514 NOIP2010 引水入城 BFS、贪心

    传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...

  9. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

随机推荐

  1. 【bzoj2038】 小Z的袜子(hose)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 (题目链接) 转自:http://blog.csdn.net/bossup/article/d ...

  2. Bzoj2434 [Noi2011]阿狸的打字机

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2536  Solved: 1415 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到 ...

  3. PHP FastCGI RCE Vul

    catalog . Introduction . nginx文件类型错误解析漏洞 . 针对直接公网开放的Fast-CGI攻击 . 通过FCGI API动态修改php.ini中的配置实现RCE 1. I ...

  4. lua的corroutine学习

    lua的corroutine学习 function receive (prod) local status, value = coroutine.resume(prod) return value e ...

  5. linux文件系统简介

    文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...

  6. Hackerrank Going to the Office

    传送门 Problem Statement Ms.Kox enjoys her job, but she does not like to waste extra time traveling to ...

  7. 在Ubuntu上如何往fcitx里添加输入法

    Ubuntu 16.04引入了一个新的包管理工具apt, 用法与apt-get类似. 在终端用apt搜索fcitx支持的输入法 apt search fcitx All Fcitx related p ...

  8. 如何让vim编辑器永久显示行号

    在Linux环境下的编辑器有vi.vim.gedit等等.进入这些编辑器之后,为了方便我们需要编辑器显示出当前的行号,可偏偏编辑器默认是不会显示行号的.我们有二种办法可以解决: 第一种是,手动显示:在 ...

  9. SaltStack项目实战(七)

    上文 http://www.cnblogs.com/shhnwangjian/p/6027992.html 四.memcached 1)创建www用户 mkdir -p /srv/salt/prod/ ...

  10. FIFA halts 2026 bids amid scandal 国际足联在丑闻期间停止2026年足球世界杯申请

    FIFA halts 2026 bids amid scandal 国际足联在丑闻期间停止2026年足球世界杯申请 But official insists 2018 Cup will stay in ...