桶排序 P2676 [USACO07DEC]Bookshelf B

題目描述
Farmer John最近爲奶牛們的圖書館添置了一個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。

所有N(1 <= N <= 20,000)頭奶牛都有一個確定的身高H_i(1 <= H_i <= 10,000)。設所有奶牛身高的和爲S。書架的高度爲B,並且保證 1 <= B <= S < 2,000,000,007。

爲了夠到比最高的那頭奶牛還要高的書架頂,奶牛們不得不像演雜技一般,一頭站在另一頭的背上,疊成一座“奶牛塔”。當然,這個塔的高度,就是塔中所有奶牛的身高之和。爲了往書架頂上放東西,所有奶牛的身高和必須不小於書架的高度。

顯然,塔中的奶牛數目越多,整座塔就越不穩定,於是奶牛們希望在能夠到書架頂的前提下,讓塔中奶牛的數目儘量少。 現在,奶牛們找到了你,希望你幫她們計算這個最小的數目。

輸入格式
第1行: 2個用空格隔開的整數:N 和 B * 第2…N+1行: 第i+1行是1個整數:H_i
輸出格式
第1行: 輸出1個整數,即最少要多少頭奶牛疊成塔,才能夠到書架頂部
輸入輸出樣例

輸入

6 40
6
18
11
13
19
11

輸出

3

說明/提示

輸入說明:

一共有6頭奶牛,書架的高度爲40,奶牛們的身高在6…19之間。

輸出說明:
hj
一種只用3頭奶牛就達到高度40的方法:18+11+13。當然還有其他方法,在此不一一列出了。

思路:
無非就是排序取最大的幾個數罷了,數據量不大,用桶排序即可,注意時刻保證 h > 0 就好。
代碼:

#include <bits/stdc++.h>
using namespace std;
int a[20001];
int main() {
    int x,n,h,z=0;
    cin>>n>>h;
    for (int i = 0; i < n; ++i) {
        cin>>x;
        a[x]++;
    }
    for (int j = 20000; h > 0; --j) {
        while(a[j]!=0 && h>0){
            h-=j;
            a[j]--;
            z++;
        }
    }
    cout<<z;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章