题解洪水
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; }
以上是关于题解洪水的主要内容,如果未能解决你的问题,请参考以下文章