洪水(Flooded! uva815)

本文介绍了一个解决UVA815问题的C++程序实现,该问题涉及通过给定地形高度和降雨量来计算区域内的平均水位及淹没百分比。文章通过排序和逐个检查地形高度的方法来确定最终的水位。

这题比较简单, 但要注意数据类型。

// uva815.cpp
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX 1000000
#define MAXN 900
int elevation[MAXN];
int main(){
    int n, m, kase = 0;
    while (scanf("%d%d", &n, &m) != EOF && n != 0){
        int p = 1;
        for (int row = 1; row <= m; row++)
            for (int col = 1; col <= n; col++)
                scanf("%d", &elevation[p++]);
        std::sort(elevation + 1, elevation + p);
        int tot = n * m;
        elevation[tot + 1] = MAX; // sentinal
        scanf("%d", &p);
        double left_water = p / 100.0;   // p may less than 100, so the type of left_water cannot be integer 
        int pre = 1, next = 1;
        double water_level = elevation[1];
        int submerged;
        for(;;){
            while (elevation[pre] == elevation[next]) next++;
            if (next == tot + 1) { // it can conclude that elevation[tot - 1] == elevation[tot]
                submerged = tot;
                water_level = elevation[pre] + left_water * 1.0 / tot;
                break;
            }
            else{  // elevation[pre] != elevation[next]
                if (left_water <= (next - 1) * (elevation[next] - elevation[pre])){
                    submerged = next - 1 ;
                    water_level = elevation[pre] + left_water * 1.0 / (next - 1);
                    break;
                }
                else {
                    left_water = left_water - (next - 1) * (elevation[next] - elevation[pre]);
                    pre = next;
                }
            }
        }
        printf("Region %d\n", ++kase);
        printf("Water level is %.2lf meters.\n", water_level);
        printf("%.2lf percent of the region is under water.\n\n", 100.0 * submerged / float(tot));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值