UVa815_Flooded!

 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 }
如图,将海拔按高矮排序好(先排序好,比较容易计算已经淹没地区的水量),由于是水往地处流,如果水量如图,淹没区域如图中阴影地区。
原文地址:https://www.cnblogs.com/douzujun/p/5772413.html