Flooded! UVA - 815 排序+思維

將洪水從海拔低到高淹沒格子中,求海拔和格子被淹沒的比例。
首先排序
方法一:直接法。從低到高填格子,直到洪水沒有,或者填滿所有格子爲止。
方法二:思維法。計算把所有洪水放在一個格子(包括該格子之前的格子),檢查形成的平均海拔與下一個格子的海拔比較。
假設給出一組數據
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章