算法竞赛入门经典 习题4-10

UVa815

Flooded!

这题就很不错,虽然最后输出浮点数,但是不同精度控制。

还有这题的背景倒是挺不错的。

为了让买房者心里对房子被洪水淹了的情况有个谱,某家公司给住户提供了一个单元格大小为10米乘10米的沙盘区域,所有的新房都会建在单元格中。洪水可能来自雨水、雪水和自来水。洪水都会先把海拔最低的房子淹了(因为水往低处流)。因此为了简便,我们假设这种情况成立,并且水不会渗入到地下。

从天气预报可以得知该区域总的洪水量,从买房者的角度来看,最后需要确认洪水在此区域中的最终海拔,以及由多少单元格没洪水完全淹没(水的海拔高度严格大于该区域的海拔)

输入mn表示区域大小,然后再输入每个单元格的海拔,最后输入洪水的体积(单位立方米);输出洪水的最终海拔,以及淹没百分比。

如果不容易理解的话可以想象成楼梯,水位没过了第一级台阶,才会继续没过第二级台阶。没过第一级台阶需要的水量是一个台阶的体积,在此基础上没过第二级台阶需要的水量是2个台阶体积。

#include 
#include 
#include 
#include 

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
*/

你可能感兴趣的:(《算法竞赛入门经典》)