UVA815--Flooded

本文介绍了一种洪水模拟算法,通过对网格中各格子的高度进行排序,并根据输入的雨水总体积来计算水位高度及受淹区域的百分比。该算法适用于模拟特定地理条件下洪水的淹没情况。

题意:
有一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值