UVa 815 Flooded!

Flooded!

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 815


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2017/12/31

#include "stdio.h"

#define MAX 1000

struct node {
    int level;     // 海拔
    int space;     // 底面积
    int flag;     // 土地标志
};

int main() {
    int m, n;
    int region = 0;
    while (scanf("%d%d", &m, &n) != EOF) {
        if (m == 0 && n == 0)
            break;
        region += 1;
        // 输入土地海拔和雨水量
        node a[MAX];
        int t = m * n;
        for (int i = 0; i < t; i++) {
            scanf("%d", &a[i].level);
            a[i].space = 100;
            a[i].flag = 1;
        }
        int rain;
        scanf("%d", &rain);
        // 按海拔升序
        for (int i = 1; i < t; i++) {
            for (int k = 0; k < t - i; k++) {
                if (a[k].level > a[k + 1].level) {
                    node tmp = a[k];
                    a[k] = a[k + 1];
                    a[k + 1] = tmp;
                }
            }
        }
        // 把海拔相同的土地归并
        int i, k;
        for (i = 0; i < t - 1; i = k) {
            for (k = i + 1; a[i].level == a[k].level; k++) {
                a[i].space += a[k].space;
                a[k].flag = 0;
                a[i].flag += 1;
            }
        }
        // 把有效土地存到另一个数组
        node b[MAX];
        k = 0;
        for (i = 0; i < t; i++) {
            if (a[i].flag) {
                b[k++] = a[i];
            }
        }
        b[k].level = 0xFFFFFFF;     // 在末尾加个无限高的墙
        t = k + 1;
        // 模拟注水过程
        int cap = 0;
        double level = 0;
        for (i = 0; i < t - 1; i++) {
            cap = b[i].space * (b[i + 1].level - b[i].level);
            b[i + 1].space += b[i].space;
            rain -= cap;
            level = b[i + 1].level;
            if (rain <= 0) {
                rain += cap;
                level = b[i].level;
                level += 1.0 * rain / b[i].space;
                break;
            }
        }
        int count = 0;
        for (k = 0; k <= i; k++) {
            count += b[k].flag;
        }
        double area = 100.0 * count / (m * n);
        // 输出结果
        printf("Region %d\n", region);
        printf("Water level is %.2lf meters.\n", level);
        printf("%.2lf percent of the region is under water.\n\n", area);
    }
    return 0;
}

Notes

题意:
有一个 m*n 的网格,每个格子是边长为 10 米的正方形,网格四周是无限高的墙。输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比的区域内有水(即高度严格小于水平面)。

思路:
将土地依照海拔升序排成一列,模拟注水过程即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值