將洪水從海拔低到高淹沒格子中,求海拔和格子被淹沒的比例。
首先排序
方法一:直接法。從低到高填格子,直到洪水沒有,或者填滿所有格子爲止。
方法二:思維法。計算把所有洪水放在一個格子(包括該格子之前的格子),檢查形成的平均海拔與下一個格子的海拔比較。
假設給出一組數據
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;
}