码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】洪水

时间:2019-03-27 14:10:35      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:namespace   mes   opened   out   include   for   max   onclick   else   

题目描述

  干旱使得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;
}
参考程序

 

【题解】洪水

标签:namespace   mes   opened   out   include   for   max   onclick   else   

原文地址:https://www.cnblogs.com/kcn999/p/10607062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!