PAT (Advanced Level) 1144~1147:1145Hash二次探查 1146拓扑排序 1147堆
1144 The Missing Number(20 分)
题意:给定N个数的序列,输出不在序列中的最小的正整数。
分析:
1、给定的N个数可能为正,可能为负,可能重复。
2、由于N≤105,所以,当N个数互不重复,且都为正的情况下,所输出的数最大,为105+1。
3、将序列中的数标注后,枚举1~105+1,遇到的第一个未标注的数即为答案。
4、注意标注序列中的数时,大于105+1的数没必要标注(因为给定的数在int范围内),否则会下标越界。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAXN = 100000 + 10;
int a[MAXN];
bool vis[MAXN];
int main(){
int N;
while(scanf("%d", &N) == 1){
memset(vis, false, sizeof vis);
for(int i = 0; i < N; ++i){
scanf("%d", &a[i]);
if(a[i] > 0 && a[i] < MAXN) vis[a[i]] = true;
}
for(int i = 1; i < MAXN; ++i){
if(!vis[i]){
printf("%d", i);
break;
}
}
}
return 0;
}
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)
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int MAXN = 10000 + 10;
int MSize, N, M;
int Hash[MAXN];
bool judge_prime(int x){
if(x <= 1) return false;
for(int i = 2; i <= (int)(sqrt(x + 0.5)) + 1; ++i){
if(x % i == 0) return false;
}
return true;
}
int main(){
while(scanf("%d%d%d", &MSize, &N, &M) == 3){
memset(Hash, -1, sizeof Hash);
while(!judge_prime(MSize)) ++MSize;
int key;
while(N--){
scanf("%d", &key);
int Hkey = key % MSize;
bool ok = false;
if(Hash[Hkey] == -1){
Hash[Hkey] = key;
ok = true;
}
else{
for(int i = 1; i <= MSize - 1; ++i){
int tmp = (Hkey + i * i) % MSize;
if(Hash[tmp] == -1){
Hash[tmp] = key;
ok = true;
break;
}
}
}
if(!ok) printf("%d cannot be inserted.\n", key);
}
int x;
int sum = 0;
for(int i = 0; i < M; ++i){
scanf("%d", &x);
int Hkey = x % MSize;
bool ok = false;
for(int j = 0; j < MSize; ++j){
int tmp = (Hkey + j * j) % MSize;
++sum;
if(Hash[tmp] == -1 || Hash[tmp] == x){
ok = true;
break;
}
}
if(!ok) ++sum;
}
printf("%.1lf\n", sum * 1.0 / M);
}
return 0;
}
1146 Topological Order(25 分)
题意:给定一个有向图,判断所给的K个选项中哪个不是该图的拓扑排序。
分析:
1、遍历所给的拓扑序,边遍历边将该点所指向的点入度-1。
2、在进行上述操作的前提下,如果遍历到的每个点入度都为0,则该序列一定是拓扑序。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<vector>
using namespace std;
const int MAXN = 1000 + 10;
vector<int> G[MAXN];
int indegree[MAXN];
int tmpindegree[MAXN];
vector<int> ans;
vector<int> v;
int N, M;
void init(){
for(int i = 1; i <= N; ++i) G[i].clear();
memset(indegree, 0, sizeof indegree);
ans.clear();
}
bool judge(){//判断是否为拓扑序列
int len = v.size();
for(int i = 0; i < len; ++i){
int cur = v[i];
if(!tmpindegree[cur]){
int l = G[cur].size();
for(int j = 0; j < l; ++j){
--tmpindegree[G[cur][j]];
}
}
else return false;
}
return true;
}
int main(){
while(scanf("%d%d", &N, &M) == 2){
init();
int st, ed;
for(int i = 0; i < M; ++i){
scanf("%d%d", &st, &ed);
G[st].push_back(ed);
++indegree[ed];
}
int K, x;
scanf("%d", &K);
for(int i = 0; i < K; ++i){
memcpy(tmpindegree, indegree, sizeof indegree);
v.clear();
for(int j = 0; j < N; ++j){
scanf("%d", &x);
v.push_back(x);
}
if(!judge()) ans.push_back(i);
}
int len = ans.size();
for(int i = 0; i < len; ++i){
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}
1147 Heaps(30 分)
题意:给定一个完全二叉树的层次遍历序列,问该二叉树是否为堆结构,并进一步判断是大顶堆还是小顶堆,最后输出该二叉树的后序遍历序列。
分析:
1、由于给定的N (1<N≤1000)个点数字各不相同,且大小都在int范围内,首先对N个点进行坐标离散化。
2、利用queue边读取边判断该二叉树是否为堆结构,同时记录每个点的左右子结点。
3、进行后序遍历。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
const int MAXN = 100000 + 10;
int lchild[MAXN], rchild[MAXN];
map<int, int> mp1;
map<int, int> mp2;
queue<int> q;
vector<int> ans;
int root;
int cnt;
void init(){
memset(lchild, 0, sizeof lchild);
memset(rchild, 0, sizeof rchild);
mp1.clear();
mp2.clear();
while(!q.empty()) q.pop();
ans.clear();
}
void get_id(int x){//坐标离散化
++cnt;
mp1[x] = cnt;
mp2[cnt] = x;
}
int judge(int type_l, int type_r){
if(type_l == 1 && type_r != 2){
return 1;//Min Heap
}
else if(type_l == 2 && type_r != 1){
return 2;//Max Heap
}
else{
return 3;
}
}
void print_postorder(int x){
if(lchild[x]) print_postorder(lchild[x]);
if(rchild[x]) print_postorder(rchild[x]);
ans.push_back(mp2[x]);
}
int main(){
int M, N;
while(scanf("%d%d", &M, &N) == 2){
while(M--){
init();
cnt = 0;
int x;
scanf("%d", &x);
q.push(x);
get_id(x);
root = mp1[x];
int type = 0;
bool ok = true;
while(!q.empty()){
int top = q.front();
q.pop();
int type_l = 0;
int type_r = 0;
if(cnt < N){
scanf("%d", &x);
get_id(x);
lchild[mp1[top]] = mp1[x];
q.push(x);
if(top < x) type_l = 1;
else type_l = 2;
}
if(cnt < N){
scanf("%d", &x);
get_id(x);
rchild[mp1[top]] = mp1[x];
q.push(x);
if(top < x) type_r = 1;
else type_r = 2;
}
if(type == 0) type = judge(type_l, type_r);
else{
int tmptype = judge(type_l, type_r);
if(tmptype != type || type == 3) ok = false;
}
if(cnt == N) break;
}
if(!ok) printf("Not Heap\n");
else{
if(type == 1) printf("Min Heap\n");
else printf("Max Heap\n");
}
print_postorder(root);
int len = ans.size();
for(int i = 0; i < len; ++i){
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
}
return 0;
}
PAT (Advanced Level) 1144~1147:1145Hash二次探查 1146拓扑排序 1147堆的更多相关文章
- 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 ...
- PAT (Advanced Level) Practice(更新中)
Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...
- PAT (Advanced Level) Practice 1001-1005
PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...
- PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642
PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642 题目描述: The task is really simple: ...
- PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...
- 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 ...
- PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642
PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...
- 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) ...
- 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 ...
随机推荐
- maven设置镜像地址
方法一:在maven文件夹下的settings.xml中添加(对所有的项目都有效) <mirror> <id>alimaven</id> <name>a ...
- IDEA 解决 Maven 依赖冲突的高能神器,这一篇够不够?
1.何为依赖冲突 Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的.Maven的依赖机制会导致Jar包的冲突.举个例子,现在你的项目中,使用了两个Jar包,分别是A和B.现在A需要依 ...
- 为spring boot 写的Controller中的rest接口配置swagger
1.pom.xml文件中加入下列依赖: <dependency> <groupId>io.springfox</groupId> <artifactId> ...
- Can you answer these queries?-HDU4027 区间开方
题意: 给你n个数,两个操作,0为区间开方,1为区间求和 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 思路: 如果当该区间的数都为1,我们没必要 ...
- 从零构建以太坊(Ethereum)智能合约到项目实战——第24章 IPFS + 区块链
P93 .1-IPFS环境配置P94 .2-IPFS+P .IPNS+P .个人博客搭建 - 如何在IPFS新增一个文件P95 .3-IPFS+P .IPNS+P .个人博客搭建 - 通过ipfs创建 ...
- day8 文件的读取
只读 只写 追加 读写 功能 username = input('请输入你要注册的用户名:') password = input('请输入你要注册的密码:') with open('list_of_i ...
- SwiftStack 因战略转变而裁员
导读 销售团队在前段圣诞节来临前面临裁减的糟糕处境.企业云存储公司SwiftStack进行了裁员,人数不详,公司规模因此缩小. IT外媒The Register获悉,这家公司裁掉了大概一半的人员,但总 ...
- HDU 5570:balls 期望。。。。。。。。。。。。。。。
balls Accepts: 19 Submissions: 55 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/655 ...
- 各颜色LED压降
一下是参考1.直插LED压降红:2.0-2.2V黄:1.8-2.0V绿:3.0-3.2V 额定电流约20mA.2.贴片LED压降红:1.82-1.88V,电流5-8mA绿:1.75-1.82V,3-5 ...
- sparkRDD:第4节 RDD的依赖关系;第5节 RDD的缓存机制;第6节 DAG的生成
4. RDD的依赖关系 6.1 RDD的依赖 RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency ...