經典入門_Hash的應用
阿新 • • 發佈:2018-02-04
需要 eof ++ 固定 給定 靜態 post 如果 pre
Hash:將存儲位置與數據本身對應掐來的存儲手段就是Hash
例2.5 統計通成績學生人數(1018)
題目描述:讀入n(n<=1000)名學生的成績(0~100,整型)(當讀到n時結束),將獲得某一給定分數的學生人數輸出。
樣例輸入: 3 80 60 90 60 2 85 66 0 5 60 75 90 55 75 75 0
樣例輸出: 1 0 2
#include<stdio.h> int main(){ int n,tmp,num; int buf[101]; while(scanf("%d",&n)!=EOF&&n!=0){for(int i=0;i<=100;i++)//也可直接定義為int Hash[101]={0}; buf[i]=0; for(int i=0;i<n;i++){ scanf("%d",&tmp); buf[tmp]++; } scanf("%d",&num); printf("%d\n",buf[num]); } return 0; }
例2.6 Sort (1431)
題目描述:給你n個整數,請按從大到小的順序輸出前m大的數。第一行有兩個數n,m(0<n,m<1000000),第二行包含n個各不相同,且處於區間[-500000,500000]的整數。
樣例輸入: 5 3 3 -35 92 213 -644 樣例輸出: 213 92 3
由於代排序數字的數量十分龐大(1000000),即使使用快排也仍有可能超時。而哈希只需要從尾到頭遍歷數組,其時間復雜度仍在百萬數量級,解法符合要求。
由於輸入數據中出現了負數,於是我們不能直接把輸入數據當做數組下標來訪問數組元素,而是將每一個輸入的數據都加上一個固定偏移值,使數據區間映射到數組下標區間。
本題還要註意在最後一個數字之後不存在空格。
#include<stdio.h> int Hash[1000001];//在函數內部的靜態數組是在棧上分配空間所以不能開得太大,而全局的數組是在數據段分配空間所以可以弄大些。如果在函數內部開大數組可能產生棧溢出。int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<=1000000;i++) Hash[i]=0; for(int i=1;i<=n;i++){ int tmp; scanf("%d",&tmp); Hash[tmp+500000]++; } for(int i=1000000;i>=0;i--){ if(Hash[i]!=0){ printf("%d",i-500000); m--; if(m!=0) printf(" "); else{ printf("\n"); break; } } } } return 0; }
經典入門_Hash的應用