题意:
有一个n×m的网格,每个格子是边长10米的正方形,网格四周是无限大的墙壁。输入每个格子的海拔高度,以及网格内雨水的总体积。输出水位的海拔高度以及有多少百分比的区域有水(即高度严格小于水平面)。
思路:
对格子高度排序,遍历格子,当当前格子下洪水体积大于总体积时,停止遍历。记录此时格子的位置n。覆盖面积即为 n与总格子数的比值,水位高度为总体积减去前n-1个格子装的体积再除以面积。
代码:
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
int main() {
int m, n, T = 0;
while (true) {
cin >> m >> n;
if (!m && !n)
break;
multiset<int> se;
int len = m * n, total;
for (int i = 0; i < len; i++) {
int t;
cin >> t;
se.insert(t);
}
cin >> total;
multiset<int>::iterator it = se.begin();
int a[len], b[len], j = 1;
a[0] = *it;
b[0] = 0;
it++;
for (; it != se.end(); it++) {
a[j] = *it;
b[j] = a[j] - a[j - 1];
j++;
}
int sum = 0, pos = 1;
bool flag = false;
for (; pos < len; pos++) {
sum += b[pos] * pos;
if (sum * 100 >= total) {
flag = true;
break;
}
}
if (flag) sum -= b[pos] * pos;
int re = total - sum * 100;
double level = a[pos - 1] + re * 1.0 / (pos * 100);
printf("Region %d\nWater level is %.2lf meters.\n", ++T, level);
printf("%.2lf percent of the region is under water.\n\n",
pos * 100.0 / len);
}
return 0;
}