将洪水从海拔低到高淹没格子中,求海拔和格子被淹没的比例。
首先排序
方法一:直接法。从低到高填格子,直到洪水没有,或者填满所有格子为止。
方法二:思维法。计算把所有洪水放在一个格子(包括该格子之前的格子),检查形成的平均海拔与下一个格子的海拔比较。
假设给出一组数据
2 2
5 3
2 8
1000
排序之后海拔为2 3 5 8 ,计算把所有洪水放在一个格子里形成的高度和下一个格子比较。
我们形成的海拔总是以0海拔为参考线。
我们可以得到计算公式:(洪水+当期格子海拔)/格子个数,也就是洪水形成的平均海拔。
处理第一个格子,这样第一个格子全是洪水,平均海拔为12,大于第二个格子3,继续循环。
到第二个格子,(12+3)/2=7.5洪水所形成的平均海拔7.5打大于第三个格子的海拔5,继续循环。
…大概过程我们都可以知道了,笔者就不再介绍。
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cstdio>
using namespace std;
int main()
{
vector<int> h;
int n, m, i, j, x;
double v, k, hi;
int cnt = 0;
while (~scanf("%d%d", &n, &m) && n && m)
{
h.clear();
n *= m;
for (i = 0; i < n; ++i)
{
scanf("%d", &x);
h.push_back(x);
}
h.push_back(INT_MAX);
sort(h.begin(), h.end());//高度排序
scanf("%lf", &v);
v /= 100;//除以底面积,v为最大单位面积高度
for (i = 1; i <= n; ++i)//表示0-i-1装下洪水的高度
{
v += h[i-1];
hi = v/i;
if (hi < h[i])//如果小于下一个格子的高度则为答案
{
k = i;
break;
}
}
printf("Region %d\nWater level is %.2lf meters.\n", ++cnt, hi);
printf("%.2lf percent of the region is under water.\n\n", k*100/n);
}
return 0;
}