UVa815
这题就很不错,虽然最后输出浮点数,但是不同精度控制。
还有这题的背景倒是挺不错的。
为了让买房者心里对房子被洪水淹了的情况有个谱,某家公司给住户提供了一个单元格大小为10米乘10米的沙盘区域,所有的新房都会建在单元格中。洪水可能来自雨水、雪水和自来水。洪水都会先把海拔最低的房子淹了(因为水往低处流)。因此为了简便,我们假设这种情况成立,并且水不会渗入到地下。
从天气预报可以得知该区域总的洪水量,从买房者的角度来看,最后需要确认洪水在此区域中的最终海拔,以及由多少单元格没洪水完全淹没(水的海拔高度严格大于该区域的海拔)
输入m
和n
表示区域大小,然后再输入每个单元格的海拔,最后输入洪水的体积(单位立方米);输出洪水的最终海拔,以及淹没百分比。
如果不容易理解的话可以想象成楼梯,水位没过了第一级台阶,才会继续没过第二级台阶。没过第一级台阶需要的水量是一个台阶的体积,在此基础上没过第二级台阶需要的水量是2个台阶体积。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
int region = 1, m, n;
while (cin >> m >> n){
if (m == 0 && n == 0) break;
vector<int> viElevation(m * n, 0);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> viElevation[i * n + j];
}
}
sort(viElevation.begin(), viElevation.end());
size_t volume, elevation, cubic, cnt = 1;
double dHigh, dPercent;
cin >> volume;
for (; cnt < viElevation.size(); cnt++)
{
elevation = viElevation[cnt] - viElevation[cnt - 1];
cubic = elevation * cnt * 100;
if (volume >= cubic) volume -= cubic;
else break;
}
dHigh = ((double)volume) / cnt / 100 + viElevation[cnt - 1];
cout << "Region " << region++ << endl;
cout << "Water level is " << setprecision(2) << fixed << dHigh << " meters." << endl;
cnt = 0;
for (auto i : viElevation)
{
if (i < dHigh) cnt++;
}
dPercent = ((double)cnt) / viElevation.size() * 100.0;
cout << dPercent << " percent of the region is under water." << endl;
cout << endl;
}
return 0;
}
/*
3 3
25 37 45
51 12 34
94 83 27
10000
0 0
*/