题解洪水

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解洪水相关的知识,希望对你有一定的参考价值。

题目描述

  干旱使得Farmer John农场上的草死了很多。所以他跳一种非洲部落舞蹈来求雨。制雨者知道他想求多少雨。不幸的是,制雨者太热情了,农场面临着洪水的威胁。帮助Farmer John找到水的高度,他可以把他的奶牛移到安全的地方。

  农场是由M×N(1≤M≤400,1≤N≤400)的一个个一米边长的正方形方格组成的。每格有一个值为整数的海拔高度(1≤海拔高度≤10000)。给出一个M×N的表格和降水量V(1≤V≤1000000000)。

  水总是先流到最低的方格,不管该方格在哪儿。

  降水量总是整数。你必须算出水上升的高度,水面和海平面(海拔高度为0)之间的陆地的量(可能为0)。陆地高度和水面相同时看成被淹没,高出部分不会被水淹没。

 

输入输出格式

输入格式

  第一行,三个整数:M,N,V;

  接下来是一个M×N的表格(整数)。

 

输出格式

  一行,两个整数,水上升的高度,水面和海平面之间的陆地的量。

 

输入输出样例

输入样例

4 5 33

2 2 2 2 2

1 3 4 3 2

2 3 5 3 2

2 4 1 1 2

 

输出样例

4 43

 

说明

样例说明

  水将上升4米,淹没的区域标记1,2,3,4。水下陆地的量:1×3+2×10+3×4+4×2=43。

 

题解

  注意达到最高点是洪水不一定已经流完。

技术图片
#include <iostream>
#include <algorithm>

using namespace std;

int m,n,v;
int a[10001];
int low=10001,high=-1;
int ans;

int main()
{
    cin>>m>>n>>v;
    if(!v) {cout<<0;return 0;}
    int temp;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>temp;
            low=min(low,temp);
            high=max(high,temp);
            a[temp]++;
        }
    }
    for(int i=low;i<=high;i++) a[i]+=a[i-1];
    for(int i=1;i<low;i++) ans+=a[i]*i;
    while(1)
    {
        if(low<=high) ans+=(a[low]-a[low-1])*low;
        if(v>=a[min(low,high)]) v-=a[min(low,high)],low++;
        else break;
    }
    cout<<low<<" "<<ans; 
    return 0;
}
参考程序

 

以上是关于题解洪水的主要内容,如果未能解决你的问题,请参考以下文章

题解1235. 洪水 (Standard IO)

洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)

使用matlab进行洪水填充

最强解析面试题:洪水...

洪水填充图像的图像处理

iPad 中的洪水填充太慢了