P1514 引水入城
概述
首先,这是一道好题,这道题既考查了图论的dfs知识,又考察了区间贪心问题中很典型的区间覆盖问题,着实是一道好题。
大概思路说明
我们观察到,只有第一行可以放水库,而第一行在哪里放水库的结果就是直接导致最后一行某些点被覆盖。所以我们只需要找到第一行水库与最后一行被覆盖的关系即可完成决策,中间的行没有意义。我们对于第一行的每一个数进行dfs,可以预处理出所有的区间。然后问题就转化成了用一些区间覆盖一条线段的问题。直接求解即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
int n, m, high[maxn][maxn], vis[maxn][maxn];
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
void dfs(int x, int y) {
vis[x][y] = 1;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 1 && nx <= m && ny >= 1 && ny <= n &&!vis[nx][ny] && high[nx][ny] < high[x][y]) {
dfs(nx, ny);
}
}
}
struct line
{
int left, right, num;
bool operator < (const line b) const {
if(this->left != b.left) return this->left < b.left;
int la = this->right - this->left;
int lb = b.right - b.left;
return la > lb;
}
}ls[maxn];
int main() {
// freopen("input.in", "r", stdin);
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++)
cin >> high[j][i];
}
int dfn = 0;
for(int i = 1; i <= m; i++) {
memset(vis, 0, sizeof(vis));
dfs(i, 1);
int l = -1, r = -1;
for(int j = 1; j <= m; j++) {
if(vis[j][n]) {l = j; break;}
}
int j;
if(l!=-1)for(j = l; j <= m; j++) {
if(!vis[j][n]) {r = j - 1; break;}
}
if(j == m + 1 && l != -1) r = m;
if(l != -1 && r != -1) ls[dfn++] = {l, r, i};
}
int s = 1;
set<int> ans;
set<int> no;
while(s <= m) {
for(int i = 0; i < dfn; i++) {
if(ls[i].left <s ) ls[i].left = s;
if(ls[i].left > ls[i].right) ls[i] = {maxn, maxn, maxn};
}
sort(ls, ls+dfn);
if(ls[0].left == maxn) { //没有可用的区间
for(int i = s; i <= m; i++) no.insert(i);
break;
}
if(ls[0].left!=s) {
for(int i = s; i < ls[0].left; i++) no.insert(i);
}
ans.insert(ls[0].num);
s = ls[0].right+1;
}
if(no.empty()) {
cout << 1 << endl << ans.size();
}
else {
cout << 0 << endl << no.size();
}
return 0;
}
P1514 引水入城的更多相关文章
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
- 洛谷 P1514 引水入城 解题报告
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...
- [luogu]P1514 引水入城[搜索][记忆化][DP]
[luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- 洛谷P1514 引水入城 [搜索,区间DP]
题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...
- 【luogu P1514 引水入城】 题解
题目链接:https://www.luogu.org/problemnew/show/P1514 // luogu-judger-enable-o2 #include <iostream> ...
- 洛谷P1514 引水入城——dfs
题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...
- [NOIP2010] 提高组 洛谷P1514 引水入城
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- P1514 引水入城 DFS
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个NN 行\times M×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...
随机推荐
- KMP(fail数组应用) LA 3026 Period
题目传送门 题意:(训练指南P213) 求每个前缀的最短循环节 分析:利用失配函数的性质,如果i % (i - fail[i]) == 0,那么正好错位移动一个循环节长度. #include < ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
- ccc 播放动画
cc.Class({ extends: cc.Component, properties: { anim:cc.Animation, }, // use this for initialization ...
- hadoop2.2.0 + hbase 0.94 + hive 0.12 配置记录
一开始用hadoop2.2.0 + hbase 0.96 + hive 0.12 ,基本全部都配好了.只有在hive中查询hbase的表出错.以直报如下错误: java.io.IOException: ...
- JS保留小数点(四舍五入、四舍六入)实例
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- GO语言练习:构建json 和 解析JSON 实例
本文介绍如何使用Go语言自带的库把对象转换为JSON格式,并在channel中进行传输后,并把JSON格式的信息转换回对象. 1.Go语言的JSON 库 Go语言自带的JSON转换库为 encodin ...
- Controller 通信 发布接收广播
在Angularjs开发一些经验总结随笔中提到我们需要按照业务却分angular controller,避免过大无所不能的上帝controller,我们把controller分离开了,但是有时候我们需 ...
- python成长之路——第一天
一.python版本间的差异: 1.1:2.x与3.x版本对比 version 2.x 3.x print print " "或者print()打印都可以正常输出 只能print( ...
- java eclipse中的代码联动提示功能
eclipse中的代码联动提示设置:window--->preferences--->java--->editor----> content assist的auto activ ...