编程日记 cha2-3 Hash的应用
统计同成绩学生人数
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 /* 7 题目:统计同成绩学生人数 8 用时: 9 思路:hash数组统计 10 11 */ 12 13 14 int main() 15 { 16 int n; 17 int hs[101]={0}; 18 int grade ; 19 int x; 20 while (scanf("%d",&n)!=EOF && n!=0) 21 { 22 for (int i=0;i<n;i++) 23 { 24 cin >> grade ; 25 hs[grade]++; 26 } 27 cin >> x; 28 cout<<hs[x]<<endl; 29 } 30 31 return 0; 32 }
Sort(牛客没有)
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 /* 7 题目:Sort 8 用时:* tomato 9 思路:hash数组统计 10 1.排序:N属于[0,1000000],O(nlogn)的快排也会使时间复杂度达到千万级以上 11 2.输入的数字属于[-500000,500000]的区间,创建数组a,把数字对应序号存进去, 12 时间复杂度则为遍历一边整个100万级的数组而已 13 14 */ 15 int a[1000001]={0}; 16 17 int main() 18 { 19 int n,m; 20 int num; 21 while (scanf("%d %d",&n,&m)!=EOF) 22 { 23 for (int i=0;i<n;i++) 24 { 25 cin>>num; 26 a[num+500000] ++; 27 } 28 int i = 1000000; 29 while (i-- && m>0) 30 { 31 if (a[i]) 32 { 33 m--; 34 cout<<i-500000<<' '; 35 } 36 } 37 } 38 return 0; 39 }
谁是你的潜在朋友
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 /* 7 题目:谁是你的潜在朋友 8 用时:* tomato 9 思路:hash数组统计 书的编号是1-200 10 但是需要根据学生的编号和书号决定他的潜在朋友个数, 11 通过一个数组stu解决此问题, 12 因为N是动态输入,我们可以用malloc动态分配 13 14 15 */ 16 17 18 int main() 19 { 20 int n,m,num; 21 int book[201]={0}; 22 int *stu ; 23 while (scanf("%d %d",&n,&m)!=EOF) 24 { 25 stu = (int *)malloc(n*sizeof(int)); 26 for (int i=0;i<n;i++) 27 { 28 cin >> num ; 29 book[num] ++ ; 30 stu[i]=num; 31 } 32 for (int i=0;i<n;i++) 33 { 34 if (book[stu[i]]>1) 35 cout <<book[stu[i]]-1<<endl; 36 else 37 cout<<"BeiJu"<<endl; 38 } 39 40 41 } 42 43 return 0; 44 }
剩下的树
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 /* 7 题目:剩下的树 8 用时:* tomato 9 思路:hash数组统计 10 11 12 */ 13 14 int road[10001]={0}; 15 int main() 16 { 17 18 int l;// 1<= l <=10000 19 int m ;//1 <= m <= 100 20 int i,j; 21 int left,right; 22 int c=0; 23 for (i=0;i<10001;i++) 24 road[i]=1; 25 while (scanf("%d %d",&l,&m)!=EOF) 26 { 27 for (i=0;i<m;i++) 28 { 29 cin >>left >> right; 30 for (j=left;j<right+1;j++) 31 { 32 if (road[j]>0) 33 road[j]--; // 有树才需要砍树 34 } 35 36 } 37 for (i=0;i<=l;i++) 38 if (road[i]>0) 39 c++; 40 cout << c <<endl; 41 42 } 43 return 0; 44 }