[刷题]算法竞赛入门经典(第2版) 4-10/UVa815 - Flooded!

书上具体所有题目:http://pan.baidu.com/s/1hssH0KO


代码:(Accepted,0 ms)

//UVa815 - Flooded!
#include<iostream>
#include<algorithm>
int M, N, W, S[1000], T = 0;
int main()
{
    //freopen("in.txt", "r", stdin);
    while (scanf("%d%d", &M, &N) != -1 && M != 0 && N != 0) {
        for (int i = 0, *p = S;i < M*N;++i)
            scanf("%d", p++);
        scanf("%d", &W);
        std::sort(S, S + M*N);
        int i, water = 0;
        for (i = 1;i < M*N;++i) {
            int t = water + i*(S[i] - S[i - 1]) * 100;
            if (t >= W) break;
            water = t;
        }
        float level = (float)(W - water) / (float)(i * 100) + S[i - 1];
        printf("Region %d\nWater level is %.2f meters.\n", ++T, level);
        printf("%.2f percent of the region is under water.\n\n", (float)(i * 100) / (float)(M*N));
    }
    return 0;
}

题意:简单的理解,就是给你一个铁桶,铁桶桶壁无限高,桶底是个长方形,一边长M · 10米,另一边长N · 10米。把这个桶底分为M · N个正方形区域,即每个正方形边长10米。现在每单个正方形区域高度处处都是一样的,每个不同的区域高度不一。现在一桶体积位W的水倒进去,问淹了多少区域,水高度多少。


分析:看懂这题后感觉很惊奇,原来在现实生活中都没想过的简单问题在编程里实现要考虑的东西还不少!紫书说:本题有多种解法,可以锻炼思维。那我先说说我想到的方法吧:

  1. 计算平均海拔后再看哪些地本应该是露在外面的,依此调整水高度。但是后来发现并不合算。
  2. 一桶水全浇第一块地上,往旁边扩散。但是怎么实现。。想想也不合算。
  3. 每10 · 10 · 1体积的水填进最低海拔的区域去,对于一样高的区域随便填哪个。直到最后可能发现水平面不平,把凸出来的水平均划分到整个没在水里的区域。但是按每一个单位的水来循环,循环量很大,最后凸出来的水也要分开计算。
  4. 现在使用的方法。(本来想到好几个方法,最后发现其实都很相近,把这些类似的方法整合、优化成了这一个)升序排序每一个区域的高度,一个区域一个区域地填水。具体如下:
    这里写图片描述

    这里写图片描述

转载于:https://www.cnblogs.com/xienaoban/p/6798096.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值