Flooded! UVA - 815 排序+思维

16 篇文章 0 订阅

将洪水从海拔低到高淹没格子中,求海拔和格子被淹没的比例。
首先排序
方法一:直接法。从低到高填格子,直到洪水没有,或者填满所有格子为止。
方法二:思维法。计算把所有洪水放在一个格子(包括该格子之前的格子),检查形成的平均海拔与下一个格子的海拔比较。
假设给出一组数据
2 2
5 3
2 8
1000

排序之后海拔为2 3 5 8 ,计算把所有洪水放在一个格子里形成的高度和下一个格子比较。
我们形成的海拔总是以0海拔为参考线。
我们可以得到计算公式:(洪水+当期格子海拔)/格子个数,也就是洪水形成的平均海拔。
在这里插入图片描述
处理第一个格子,这样第一个格子全是洪水,平均海拔为12,大于第二个格子3,继续循环。
在这里插入图片描述
到第二个格子,(12+3)/2=7.5洪水所形成的平均海拔7.5打大于第三个格子的海拔5,继续循环。
在这里插入图片描述
…大概过程我们都可以知道了,笔者就不再介绍。

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cstdio>
using namespace std;
int main()
{
    vector<int> h;
    int n, m, i, j, x;
    double v, k, hi;
    int cnt = 0;
    while (~scanf("%d%d", &n, &m) && n && m)
    {
        h.clear();
        n *= m;
        for (i = 0; i < n; ++i)
        {
            scanf("%d", &x);
            h.push_back(x);
        }
        h.push_back(INT_MAX);
        sort(h.begin(), h.end());//高度排序
        scanf("%lf", &v);
        v /= 100;//除以底面积,v为最大单位面积高度
        for (i = 1; i <= n; ++i)//表示0-i-1装下洪水的高度
        {
            v += h[i-1];
            hi = v/i;
            if (hi < h[i])//如果小于下一个格子的高度则为答案
            {
                k = i;
                break;
            }
        }
        printf("Region %d\nWater level is %.2lf meters.\n", ++cnt, hi);
        printf("%.2lf percent of the region is under water.\n\n", k*100/n);
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值