二十八、 统计工龄
二十八、 統計工齡
文章目錄
- 二十八、 統計工齡
- 題目描述
- 解題思路
- 上機代碼
題目描述
給定公司N名員工的工齡,要求按工齡增序輸出每個工齡段有多少員工。
輸入格式:
輸入首先給出正整數N(即員工總人數);隨后給出N個整數,即每個員工的工齡,范圍在[18, 65]。
輸出格式:
按工齡的遞增順序輸出每個工齡的員工個數,格式為:“工齡:人數”。每項占一行。如果人數為0則不輸出該項。
| 測試用例 1 | 8 30 20 20 50 37 21 51 20 | 20:3 21:1 30:1 37:1 50:1 51:1 | 1秒 | 64M | 0 |
解題思路
很簡單的排序題,數據范圍小,數據量也很少,任取一種排序方法都能輕松AC。
這里重點補充一種方法:桶排序。這種排序方法并沒有在教學大綱中,但認真讀過一些算法書籍,或者接觸過ACM的同學都應該知道這種排序方法。
桶排序是一種很快很簡單的排序方法,在指定區間 [a,b] 內,為每一個數都建立一個 “桶”,對于輸入的待排序數,屬于哪個 “桶” 就把它裝入哪對應的 “桶”中,最后按照 “桶” 的排列順序依次將數輸出即可。桶排序的思想很簡單,是一種典型的用空間換時間的排序方法。其限制條件也很明顯,對于空間開銷不能太大,空間開銷太大的排序不適合用桶排序。
如果題目中指定了數據的區間是【a,b】,我們在區間【a,b】上對每一個數都建立一個 “桶”。對于輸入數 m(a<= m <=b),就將其裝入編號為 m 的“桶”中;對于 n(a<= n <=b),就將 n 裝入編號 n 的 “桶”中。等所有輸入數都裝填完畢,按照 a 到 b 的順序,依次輸出“桶”中元素即可。(因為填入的數值與 “桶” 的編號相同,“桶”中有幾個元素,輸出時就將 “桶” 的編號輸出幾次,遇到空 “桶” 則直接跳過。)
桶的存儲結構也很簡單,用簡單的一維數組就可以。數組的長度就是“桶”的個數,數組的類型就是“桶”的最大容量。
比如 int a[100],“桶”的個數為 100,每只“桶”的容量是 32767。
上機代碼
本題就是典型的指定區間,很適合使用桶排序來求解,題目不需要依次輸出元素,僅輸出元素的個數就可以了。
#include<cstdio> #include<cstring> #include<cstdlib> using namespace std; //桶排序 int main() {int n, x, c[101];memset(c, 0, sizeof(c));scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &x);c[x]++;}for (int i = 18; i <= 65; i++){if(c[i]!=0)printf("%d:%d\n", i, c[i]);}//system("pause");return 0; }總結