水 water 积水问题 蓄水问题

本文探讨了水(water)的积水和蓄水问题,详细介绍了题目的描述、输入输出格式以及样例数据,针对数据范围提供了具体的解题思路,并提及了STL中的priority_queue作为解题工具。
摘要由CSDN通过智能技术生成

水(water )

【题目描述】
    有一块矩形土地被划分成 n×m 个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。
    一场大雨后,由于地势高低不同,许多地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出每个小块的积水高度吗?
    注意:假设矩形地外围的高度为 0。
【输入格式】
    第一行包含两个非负整数 n,m。
    接下来 n 行每行 m个整数表示第 i 行第 j 列的小块的高度。
【输出格式】
    输出 n 行,每行 m个由空格隔开的非负整数,表示每个小块的积水高度。
【样例输入】
3 3
4 4 0
2 1 3
3 3 -1
【样例输出】
0 0 0
0 1 0
0 0 1
【数据范围】
    对于 20%的数据 n,m<=4
    对于 40%的数据 n,m<=15
    对于 60%的数据 n,m<=50
    对于 100%的数据 n,m<=300 小块高度的绝对值<=10^9
    在每一部分数据中,均有一半数据保证小块高度非负

题解:

1:将负数坑填平;因为最外面一圈是0,所以可以随便填
2:将最外面一圈(1~m,1~n之间)的点加到小根堆中
3:取出堆顶从堆顶连的四个方向灌水,如果碰见不比它低的点,将其入堆,否则向其中灌水,说明:ans[i][j]+=h-map[i][j]的原因是之前填了负数坑,如果全部数据为正数,则直接ans[i][j]=h-map[i][j]即可
4:输出结果

具体问题看代码

附:STL priority_queue

#include<queue>
#include<cstdio>
#include<iostream></
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法在打问题中通常用于模拟最优的取策略,假设有一个容量为V的大桶和若干个容量为W的小桶,目标是在不浪费的情况下,通过多次将小桶装满然后倒入大桶来使大桶装满。这里是一个简单的C语言代码实现: ```c #include <stdio.h> // 定义桶的大小 #define V 80 // 大桶容量 #define W 10 // 小桶容量 // 假设总量不超过大桶的两倍 #define TOTAL_WATER (2 * V) int canFill(int remainingWater, int smallBucket) { // 如果剩余量小于等于一个小桶的容量,则直接用一个小桶装满 return remainingWater <= smallBucket; } int optimalPouringStrategy(int totalWater, int smallBuckets) { int i = 0, remainingWater = totalWater, waterFilled = 0; while (remainingWater > 0 && i < smallBuckets) { if (canFill(remainingWater, V)) { // 使用大桶装满 remainingWater -= V; waterFilled += V; } else { // 使用小桶尽可能多地装,并减去溢出的部分 int smallBucketContent = min(remainingWater, W); remainingWater -= smallBucketContent; waterFilled += smallBucketContent; } i++; } return waterFilled; } int main() { int totalWater = TOTAL_WATER; int smallBuckets = 6; // 示例中的小桶数量 printf("最大可获得的量: %d\n", optimalPouringStrategy(totalWater, smallBuckets)); return 0; } ``` 在这个代码中,`canFill()` 函数检查是否可以用一个小桶装满剩下的,`optimalPouringStrategy()` 则根据贪心策略计算最多能从总量中倒出多少放入大桶。注意这是一个简化版本,实际应用可能需要更复杂的情况处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值