1 #include <iostream>
2 //#include <fstream>
3 #include <iomanip>
4 #include <cstdio>
5 #include <algorithm>
6 #include <cstring>
7 using namespace std;
8
9 const int maxn = 30 * 30 + 10;
10 const int space = 10 * 10;
11
12 int main()
13 {
14 //ofstream out("out.txt");
15 int m, n, kase = 0, volume; //降水总量
16 double eleva[maxn], height; //每个格子的海拔高度, 输入的高度
17 double percnt = 0; //有多少百分比的区域
18 while (cin >> m >> n)
19 {
20 memset(eleva, 0, sizeof(eleva));
21 if (!m && !n) break;
22 for (int i = 0; i < m; i++)
23 {
24 for (int j = 0; j < n; j++)
25 {
26 cin >> height;
27 eleva[i * n + j] = height;
28 }
29 }
30 cin >> volume;
31 sort(eleva, eleva + m*n); //排序
32
33 int k, comput = 0; //计算已经淹没地区的水量
34 for (k = 1; k < m*n; k++)
35 {
36 int tmp = comput + (eleva[k] - eleva[k - 1]) * space * k;
37 if (tmp >= volume)
38 break;
39 comput = tmp;
40 }
41 double water = (volume - comput) / (double)(k * space) + eleva[k - 1]; //最终水平面高度是 = 当前被淹没的最高海拔 + 水面比当前海拔高出的高度
42
43 cout << "Region " << ++kase << "
";
44 cout << fixed << setprecision(2)
45 << "Water level is " << water << " meters.
";
46
47 double total = m*n;
48 percnt = (k*100.0 / total) ; //被淹没区域比例 = 当前比水平面低的海拔数 / 区域总数
49
50 cout << fixed << setprecision(2)
51 << percnt << " percent of the region is under water.
";
52 }
53
54 return 0;
55 }
如图,将海拔按高矮排序好(先排序好,比较容易计算已经淹没地区的水量),由于是水往地处流,如果水量如图,淹没区域如图中阴影地区。