1144 The Missing Number(20 分)

题意:给定N个数的序列,输出不在序列中的最小的正整数。

分析:

1、给定的N个数可能为正,可能为负,可能重复。

2、由于N≤10​5​​,所以,当N个数互不重复,且都为正的情况下,所输出的数最大,为10​5​​+1。

3、将序列中的数标注后,枚举1~10​5​​+1,遇到的第一个未标注的数即为答案。

4、注意标注序列中的数时,大于10​5​​+1的数没必要标注(因为给定的数在int范围内),否则会下标越界。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<iostream>
  6. using namespace std;
  7. const int MAXN = 100000 + 10;
  8. int a[MAXN];
  9. bool vis[MAXN];
  10. int main(){
  11. int N;
  12. while(scanf("%d", &N) == 1){
  13. memset(vis, false, sizeof vis);
  14. for(int i = 0; i < N; ++i){
  15. scanf("%d", &a[i]);
  16. if(a[i] > 0 && a[i] < MAXN) vis[a[i]] = true;
  17. }
  18. for(int i = 1; i < MAXN; ++i){
  19. if(!vis[i]){
  20. printf("%d", i);
  21. break;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

1145 Hashing - Average Search Time(25 分)

题意:给定N个数,插入到长度为MSize的哈希表中,计算查找M个数的平均查找时间。

分析:

1、哈希函数:H(key)=key%MSize

2、题目中要求通过二次探查法解决冲突,且只考虑正增量。

(1)二次探查法的探查序列为Hi=(H(key)+i)%MSize,i取值依次为1*1,-1*1,2*2,-2*2,3*3,-3*3,...,(MSize-1)*(MSize-1),-(MSize-1)*(MSize-1)

(2)由于只考虑正增量,所以i取值为1*1,2*2,3*3,...,(MSize-1)*(MSize-1)
(3)对于i依次取值来解决冲突,如果所有的取值都冲突,则插入失败。
3、查询某数时所执行的操作与插入操作相同,如果查询到的位置为空,则表示该数字不在Hash表中;如果遍历所有的i都未找到,则查询总数加1。
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<map>
  7. #include<queue>
  8. #include<vector>
  9. #include<cmath>
  10. using namespace std;
  11. const int MAXN = 10000 + 10;
  12. int MSize, N, M;
  13. int Hash[MAXN];
  14. bool judge_prime(int x){
  15. if(x <= 1) return false;
  16. for(int i = 2; i <= (int)(sqrt(x + 0.5)) + 1; ++i){
  17. if(x % i == 0) return false;
  18. }
  19. return true;
  20. }
  21. int main(){
  22. while(scanf("%d%d%d", &MSize, &N, &M) == 3){
  23. memset(Hash, -1, sizeof Hash);
  24. while(!judge_prime(MSize)) ++MSize;
  25. int key;
  26. while(N--){
  27. scanf("%d", &key);
  28. int Hkey = key % MSize;
  29. bool ok = false;
  30. if(Hash[Hkey] == -1){
  31. Hash[Hkey] = key;
  32. ok = true;
  33. }
  34. else{
  35. for(int i = 1; i <= MSize - 1; ++i){
  36. int tmp = (Hkey + i * i) % MSize;
  37. if(Hash[tmp] == -1){
  38. Hash[tmp] = key;
  39. ok = true;
  40. break;
  41. }
  42. }
  43. }
  44. if(!ok) printf("%d cannot be inserted.\n", key);
  45. }
  46. int x;
  47. int sum = 0;
  48. for(int i = 0; i < M; ++i){
  49. scanf("%d", &x);
  50. int Hkey = x % MSize;
  51. bool ok = false;
  52. for(int j = 0; j < MSize; ++j){
  53. int tmp = (Hkey + j * j) % MSize;
  54. ++sum;
  55. if(Hash[tmp] == -1 || Hash[tmp] == x){
  56. ok = true;
  57. break;
  58. }
  59. }
  60. if(!ok) ++sum;
  61. }
  62. printf("%.1lf\n", sum * 1.0 / M);
  63. }
  64. return 0;
  65. }

1146 Topological Order(25 分)

题意:给定一个有向图,判断所给的K个选项中哪个不是该图的拓扑排序。

分析:

1、遍历所给的拓扑序,边遍历边将该点所指向的点入度-1。

2、在进行上述操作的前提下,如果遍历到的每个点入度都为0,则该序列一定是拓扑序。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<map>
  7. #include<queue>
  8. #include<vector>
  9. using namespace std;
  10. const int MAXN = 1000 + 10;
  11. vector<int> G[MAXN];
  12. int indegree[MAXN];
  13. int tmpindegree[MAXN];
  14. vector<int> ans;
  15. vector<int> v;
  16. int N, M;
  17. void init(){
  18. for(int i = 1; i <= N; ++i) G[i].clear();
  19. memset(indegree, 0, sizeof indegree);
  20. ans.clear();
  21. }
  22. bool judge(){//判断是否为拓扑序列
  23. int len = v.size();
  24. for(int i = 0; i < len; ++i){
  25. int cur = v[i];
  26. if(!tmpindegree[cur]){
  27. int l = G[cur].size();
  28. for(int j = 0; j < l; ++j){
  29. --tmpindegree[G[cur][j]];
  30. }
  31. }
  32. else return false;
  33. }
  34. return true;
  35. }
  36. int main(){
  37. while(scanf("%d%d", &N, &M) == 2){
  38. init();
  39. int st, ed;
  40. for(int i = 0; i < M; ++i){
  41. scanf("%d%d", &st, &ed);
  42. G[st].push_back(ed);
  43. ++indegree[ed];
  44. }
  45. int K, x;
  46. scanf("%d", &K);
  47. for(int i = 0; i < K; ++i){
  48. memcpy(tmpindegree, indegree, sizeof indegree);
  49. v.clear();
  50. for(int j = 0; j < N; ++j){
  51. scanf("%d", &x);
  52. v.push_back(x);
  53. }
  54. if(!judge()) ans.push_back(i);
  55. }
  56. int len = ans.size();
  57. for(int i = 0; i < len; ++i){
  58. if(i) printf(" ");
  59. printf("%d", ans[i]);
  60. }
  61. printf("\n");
  62. }
  63. return 0;
  64. }

1147 Heaps(30 分)

题意:给定一个完全二叉树的层次遍历序列,问该二叉树是否为堆结构,并进一步判断是大顶堆还是小顶堆,最后输出该二叉树的后序遍历序列。

分析:

1、由于给定的N (1<N≤1000)个点数字各不相同,且大小都在int范围内,首先对N个点进行坐标离散化。

2、利用queue边读取边判断该二叉树是否为堆结构,同时记录每个点的左右子结点。

3、进行后序遍历。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<map>
  7. #include<queue>
  8. using namespace std;
  9. const int MAXN = 100000 + 10;
  10. int lchild[MAXN], rchild[MAXN];
  11. map<int, int> mp1;
  12. map<int, int> mp2;
  13. queue<int> q;
  14. vector<int> ans;
  15. int root;
  16. int cnt;
  17. void init(){
  18. memset(lchild, 0, sizeof lchild);
  19. memset(rchild, 0, sizeof rchild);
  20. mp1.clear();
  21. mp2.clear();
  22. while(!q.empty()) q.pop();
  23. ans.clear();
  24. }
  25. void get_id(int x){//坐标离散化
  26. ++cnt;
  27. mp1[x] = cnt;
  28. mp2[cnt] = x;
  29. }
  30. int judge(int type_l, int type_r){
  31. if(type_l == 1 && type_r != 2){
  32. return 1;//Min Heap
  33. }
  34. else if(type_l == 2 && type_r != 1){
  35. return 2;//Max Heap
  36. }
  37. else{
  38. return 3;
  39. }
  40. }
  41. void print_postorder(int x){
  42. if(lchild[x]) print_postorder(lchild[x]);
  43. if(rchild[x]) print_postorder(rchild[x]);
  44. ans.push_back(mp2[x]);
  45. }
  46. int main(){
  47. int M, N;
  48. while(scanf("%d%d", &M, &N) == 2){
  49. while(M--){
  50. init();
  51. cnt = 0;
  52. int x;
  53. scanf("%d", &x);
  54. q.push(x);
  55. get_id(x);
  56. root = mp1[x];
  57. int type = 0;
  58. bool ok = true;
  59. while(!q.empty()){
  60. int top = q.front();
  61. q.pop();
  62. int type_l = 0;
  63. int type_r = 0;
  64. if(cnt < N){
  65. scanf("%d", &x);
  66. get_id(x);
  67. lchild[mp1[top]] = mp1[x];
  68. q.push(x);
  69. if(top < x) type_l = 1;
  70. else type_l = 2;
  71. }
  72. if(cnt < N){
  73. scanf("%d", &x);
  74. get_id(x);
  75. rchild[mp1[top]] = mp1[x];
  76. q.push(x);
  77. if(top < x) type_r = 1;
  78. else type_r = 2;
  79. }
  80. if(type == 0) type = judge(type_l, type_r);
  81. else{
  82. int tmptype = judge(type_l, type_r);
  83. if(tmptype != type || type == 3) ok = false;
  84. }
  85. if(cnt == N) break;
  86. }
  87. if(!ok) printf("Not Heap\n");
  88. else{
  89. if(type == 1) printf("Min Heap\n");
  90. else printf("Max Heap\n");
  91. }
  92. print_postorder(root);
  93. int len = ans.size();
  94. for(int i = 0; i < len; ++i){
  95. if(i) printf(" ");
  96. printf("%d", ans[i]);
  97. }
  98. printf("\n");
  99. }
  100. }
  101. return 0;
  102. }

PAT (Advanced Level) 1144~1147:1145Hash二次探查 1146拓扑排序 1147堆的更多相关文章

  1. PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)

    Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...

  2. PAT (Advanced Level) Practice(更新中)

    Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...

  3. PAT (Advanced Level) Practice 1001-1005

    PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...

  4. PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642 题目描述: The task is really simple: ...

  5. PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...

  6. PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642 题目描述: Being unique is so important to peo ...

  7. PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...

  8. PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...

  9. PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...

随机推荐

  1. 【NGINX】LINUX安装NGINX

    安装依赖() · yum install gcc · yum install pcre-devel · yum install zlib zlib-devel · yum install openss ...

  2. Python实现图片识别加翻译【高薪必学】

    Python使用百度AI接口实现图片识别加翻译 另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字 ...

  3. 笔记-爬虫部署及运行工具-scrapydweb

    笔记-爬虫部署及运行工具-scrapydweb 1.      简介 scrapyd是爬虫部署工具,但它的ui比较简单,使用不是很方便. scrapydweb以scrapyd为基础,增加了ui界面和监 ...

  4. mongodb插入性能

    转自 https://blog.csdn.net/asdfsadfasdfsa/article/details/60872180 MongoDB与MySQL的插入.查询性能测试     7.1  平均 ...

  5. nginx访问目录是没加/的重定向控制

    static 模块提供了root与alias功能:发现目标是目录时:但URI末尾未加/时:会返回301重定向:重定向后会加/ 指令 Syntax: server_name_in_redirect on ...

  6. [蓝桥杯2017初赛]跳蚱蜢 BFS

    题目描述 如图所示: 有9只盘子,排成1个圆圈.其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8.每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空 ...

  7. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

  8. android 简单列表对话框(AlertDialog.Builder().setItems())

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间

    一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format  日至格式 改为davery格式 $remote_addr  客户端IP ...

  10. Go语言的流程控制(条件,选择,控制,跳转,闭包)

    1.条件语句: 跟C和python又不同了Go的if -else是这样的 if a<5{ return 0 } else { reutrn 1 } 1.条件不需要用括号括起来 2.左边的花括号必 ...