GYM
来源:互联网 发布:软件服务提供商 编辑:程序博客网 时间:2024/05/17 22:05
题目链接: GYM - 101572 E
题目大意
n*m的地图, 每个格子有一个海拔高度, 海拔<0的地方有水, 现在在(x, y)最深处放一个抽水机, 问最多能抽多少水, 水只能从高出往低处流
思路
一开始我想到用普通队列BFS, 但是因为水可以往八个方向流, 如果先出队列的不出最深的一个点的话, 原本能流过去的水可能就流不过去了, 所以用优先队列, 保证先出队列的是当前已处理的最深的节点
代码
Accepted 124 ms 5200 KB
#include <bits/stdc++.h>using namespace std;const int maxn = 600;int s[maxn][maxn], n, m;bool vist[maxn][maxn];int dx[] = {1, -1, 0, 0, -1, -1, 1, 1};int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};struct P{ int x, y; P(int i, int j):x(i), y(j) {} P(){} bool operator < (const P&b) const { return s[x][y] > s[b.x][b.y]; }};int main(){ cin >> n >> m; for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) scanf("%d", &s[i][j]); int x, y; scanf("%d%d", &x, &y); --x, --y; priority_queue<P> que; que.push(P(x, y)); vist[x][y] = 1; while(!que.empty()) { P now = que.top(); que.pop(); for(int i=0; i<8; ++i) { int nx = now.x + dx[i]; int ny = now.y + dy[i]; if(0<=nx && nx<n && 0<=ny && ny<m && !vist[nx][ny]) { vist[nx][ny] = 1; s[nx][ny] = max(s[now.x][now.y], s[nx][ny]); que.push(P(nx, ny)); } } } long long ans = 0; for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) if(s[i][j] < 0) ans += -s[i][j]; cout << ans << endl; return 0;}
阅读全文
0 0
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Tp5使用date函数突然报错
- 练习题L1-002. 打印沙漏
- 【Linux文件目录命令】nl命令
- 【java基础】java中异常的分类、区别、表现形式、原则及注意事项!
- 八大排序算法之(五)冒泡排序
- GYM
- Binary Tree Postorder Traversal--LeetCode
- 【Linux文件目录命令】more命令
- 分治策略总结
- Eclipse打包安卓应用
- 两台电脑同用一个git账户,其公钥和私钥的配置
- [小白式机器学习(一)] logistic regression(LR)对数几率回归 / 逻辑回归 公式推导
- GYM
- 【 音视频编解码技术】 音视频同步播放原理