【PTA】浙江大学计算机与软件学院2019年考研复试上机自测

个人学习记录,代码难免不尽人意。

呃,今天做了做19年的复试上机题,死在hash表上了,后面详细解释。心态要好,心态要好

7-1 Conway’s Conjecture
John Horton Conway, a British mathematician active in recreational mathematics, proposed a conjecture in 2014: arrange the factors of any given number in ascending order, and pull the exponents down, we can get another number. Keep doing so we must end up at a prime number. For example:

18=2×32

232=23×29

2329=17×137

17137 is a prime.

Now you are supposed to write a program to make one step verification of this conjecture. That is, for any given positive integer N, you must factorize it, and then test if the number obtained from its factors is a prime.

By the way, this conjecture has been proven false by James Davis, who has discovered a counter example: 135323853961879=13×53 2 ×3853×96179. Alas …

Input Specification:
Each input file contains one test case which gives a positive integer N (<10 5 ).

Output Specification:
For each case, first print in a line the number obtained from N’s factors. The in the next line, print Yes if the above number is a prime, or No if not.

Sample Input 1:
2329
Sample Output 1:
17137
Yes
Sample Input 2:
124
Sample Output 2:
2231
No
Sample Input 3:
87516
Sample Output 3:
2232111317
No

19分代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<stack>
using namespace std;
bool isprime(long long n){if(n<=1) return false;int mid=(int)sqrt(1.0*n);for(int i=2;i<=mid;i++){if(n%i==0) return false;}return true;
}
const int maxn=10010;
map<int,int> mp;
string tostring(int n){string num;stack<int> s;while(n!=0){int a=n%10;n=n/10;s.push(a);}while(!s.empty()){int a=s.top();s.pop();num+=a+'0';}return num;
}
long long toint(string s){long long num=0;for(int i=0;i<s.size();i++){num=num*10+s[i]-'0'; 
//		cout << num <<endl;}return num;
}
int main(){int n;scanf("%d",&n);int mid=(int)sqrt(1.0*n);for(int i=2;i<=mid;i++){while(n%i==0&&isprime(i)){if(mp.find(i)==mp.end()){mp.insert(make_pair(i,1));}else{mp[i]++;} n/=i;}}if(n!=1){mp.insert(make_pair(n,1));}string num;for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
//		cout << it->first <<"  "<<it->second << endl;if(it->second==1){string temp=tostring(it->first);num+=temp;}else{num+=tostring(it->first);num+=tostring(it->second);}}long long res;res=toint(num);printf("%lld\n",res);if(isprime(res)){printf("Yes\n");}else printf("No\n");} 

挺简单的一道题,我估计是我忘记处理特殊情况了扣了一分,当输入等于1的时候应该直接输出1 NO才对。

7-2 Play with Linked List
在这里插入图片描述
Address Data Next
where Address is the position of the node, Data is a positive integer no more than 10
5
, and Next is the position of the next node. It is guaranteed that there are at least two nodes on the list.

Output Specification:
For each case, output in order the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 68237
68237 6 33218
33218 3 99999
99999 5 12309
12309 2 00100
00100 1 -1

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<stack>
using namespace std;
const int maxn=100010;
struct node{int address;int data;int next;int before;
}Node[maxn];
node temp[maxn];
int main(){int begin,n,k;scanf("%d %d %d",&begin,&n,&k);for(int i=0;i<n;i++){int address,data,next;scanf("%d %d %d",&address,&data,&next);Node[address].address=address;Node[address].data=data;Node[address].next=next;}int op=begin,be=begin;Node[op].before=-1;op=Node[op].next;while(op!=-1){Node[op].before=be;be=op;op=Node[op].next;}op=begin;int index1,index2;int cnt=0;while(op!=-1){cnt++;if(cnt==k){index1=op;}if(Node[op].next==-1){index2=op;}op=Node[op].next;}bool flag=true;cnt=0;int tag=index1;while(index1!=-1&&index2!=tag){if(flag){temp[cnt++]=Node[index1];index1=Node[index1].before;flag=false;}else{temp[cnt++]=Node[index2];index2=Node[index2].before;flag=true;}}while(index1!=-1){temp[cnt++]=Node[index1];index1=Node[index1].before;}while(index2!=tag){temp[cnt++]=Node[index2];index2=Node[index2].before;}for(int i=0;i<cnt;i++){if(i!=cnt-1){printf("%05d %d %05d\n",temp[i].address,temp[i].data,temp[i+1].address);}else{printf("%05d %d -1\n",temp[i].address,temp[i].data);}}
} 

比较简单的一道题,我采用了双向链表来做的,找到第k个节点和最后一个节点然后开始从后往前遍历并存储到一个新的静态链表中。

7-3 Unsuccessful Searches

在这里插入图片描述
The above figure is a question from GRE-CS 2018. It states:

Given an initially empty hash table HT of size 11. The hash function is H(key)=key%7, with linear probing used to resolve the collisions. Now hash the keys 87, 40, 30, 6, 11, 22, 98 and 20 one by one into HT. What is the average search time for unsuccessful searches?

The answer is 6.

Now you are supposed to write a program to solve this kind of problems.

Input Specification:
Each input file contains one test case. For each case, the first line gives 3 positive integers TSize (≤10
3
, the table size), M (≤TSize, the divisor in the hash function), and N (≤TSize, the number of integers to be inserted). Then N non-negative integers (≤10
4
) are given in the next line, separated by spaces.

Output Specification:
Print in a line the average search time for unsuccessful searches, after hashing the N integers into the table. The answer must be accurate up to 1 decimal place.

Sample Input 1:
11 7 8
87 40 30 6 11 22 98 20
Sample Output 1:
6.0
Sample Input 2:
3 3 3
81 2 5
Sample Output 2:
4.0
Note: In sample 2, the last test of the original position counts as well.

别人的代码,这道题当时我没弄懂

#include <iostream>
#include <vector>
using namespace std;
int main() {int tsize,m,n,num;cin>>tsize>>m>>n;vector<int> rec(tsize,-1);for(int i=0;i<n;i++){cin>>num;for(int j = 0; j < tsize; j++){int pos = (num % m + j) % tsize;if(rec[pos] == -1){rec[pos] = num;break;}}		}double sum = 0;//根据哈希函数地址为MODm,因此任何一个数经散列函数计算以后的初始地址只可能在0~m-1的位置for(int i = 0; i < m; i++){for(int j = 0; j <= tsize; j++){sum++;	//计算到此位置离空位置的距离//找到空位置  int pos = (i + j) % tsize;if(rec[pos] == -1){break;}}}printf("%.1f", sum/m);return 0;
}

这道题让我没弄懂什么意思,后来我才明白了处理冲突的函数和hash散列函数不是一个函数!
散列函数是第一次用来求pos: x % M , 即题中的 H(Key) = key % 7
而冲突处理函数是针对表长的,可以散列到整张表中,nex = (pos + di) % TSize, 即题中的 nex = (pos + i ) % 11。
然后就是平均查找失败长度的概念了,这个我们需要知道(也是一个坑,之前犯过):查找到hash表为空的时候就可以判断查找失败了!如果一直不为空的话需要额外加一次查找次数,题目中说了。然后平均查找失败长度就是在0~m-1之间(因为hash散列函数只能得到这个范围的结果)处理,每个节点向后查询,直到查找到hash表为空或者Tsize次,然后所有次数除以节点个数就是我们最终想要的答案了。

这道题重点在于知道散列函数和冲突处理函数的模数不一定相同。

7-4 Ambulance Dispatch
Given the map of a city, with all the ambulance dispatch centers (救护车派遣中心) and all the pick-up spots marked. You are supposed to write a program to process the emergency calls. It is assumed that the callers are waiting at some pick-up spot. You must inform the nearest (that is, to take the minimum time to reach the spot) dispatch center if that center has at least one ambulance available. Note: a center without any ambulance must not be considered.

In case your options are not unique, inform the one with the largest number of ambulances available. If there is still a tie, choose the one that can pass the least number of streets to reach the spot, which is guaranteed to be unique.

Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N
s

(≤10
3
) and N
a

(≤10), which are the total number of pick-up spots and the number of ambulance dispatch centers, respectively. Hence the pick-up spots are numbered from 1 to N
s

, and the ambulance dispatch centers are numbered from A−1 to A−N
a

.

The next line gives N
a

non-negative integers, where the i-th integer is the number of available ambulances at the i-th center. All the integers are no larger than 100.

In the next line a positive number M (≤10
4
) is given as the number of streets connecting the spots and the centers. Then M lines follow, each describes a street by giving the indices of the spots or centers at the two ends, followed by the time taken to pass this street, which is a positive integer no larger than 100.

Finally the number of emergency calls, K, is given as a positive integer no larger than 10
3
, followed by K indices of pick-up spots.

All the inputs in a line are separated by a space.

Output Specification:
For each of the K calls, first print in a line the path from the center that must send an ambulance to the calling spot. All the nodes must be separated by exactly one space and there must be no extra space at the beginning or the end of the line. Then print the minimum time taken to reach the spot in the next line. It is assumed that the center will send an ambulance after each call. If no ambulance is available, just print All Busy in a line. It is guaranteed that all the spots are connected to all the centers.

Sample Input:
7 3
3 2 2
16
A-1 2 4
A-1 3 2
3 A-2 1
4 A-3 1
A-1 4 3
6 7 1
1 7 3
1 3 3
3 4 1
6 A-3 5
6 5 2
5 7 1
A-2 7 5
A-2 1 1
3 5 1
5 A-3 2
8
6 7 5 4 6 4 3 2
Sample Output:
A-3 5 6
4
A-2 3 5 7
3
A-3 5
2
A-2 3 4
2
A-1 3 5 6
5
A-1 4
3
A-1 3
2
All Busy

20分代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
const int maxn=1010;
const int INF=1000000000;
int G[maxn][maxn];
int nums[15];
int d[maxn];
bool visit[maxn];
vector<int> pre[maxn];
int toint(string s){int num=0;for(int i=0;i<s.size();i++){num=num*10+s[i]-'0';}return num;
}
void dijkstra(int begin,int n){for(int i=1;i<=n;i++){pre[i].clear();}fill(d,d+maxn,INF);fill(visit,visit+maxn,false);d[begin]=0;for(int i=0;i<n;i++){int u=-1,min=INF;for(int j=1;j<=n;j++){if(!visit[j]&&d[j]<min){u=j;min=d[j];}}if(u==-1) return;visit[u]=true;for(int j=1;j<=n;j++){if(!visit[j]&&G[u][j]!=INF){if(d[j]>G[u][j]+d[u]){d[j]=G[u][j]+d[u];pre[j].clear();pre[j].push_back(u);}}}}
}
vector<int> path,temp;
int streets=0;
void dfs(int st,int ed){if(ed==st){temp.push_back(ed);if(path.empty()){path=temp;streets=temp.size();}else{int street=temp.size();if(streets>street){path=temp;streets=street;}}temp.pop_back();return;}temp.push_back(ed);for(int i=0;i<pre[ed].size();i++){dfs(st,pre[ed][i]);}temp.pop_back();
}
int main(){for(int i=0;i<maxn;i++){for(int j=0;j<maxn;j++){G[i][j]=INF;}}int n,m;scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){scanf("%d",&nums[i]);}int k;scanf("%d",&k);for(int i=0;i<k;i++){string a,b;int a1,b1,dis;cin >> a >> b>> dis;if(a[0]=='A'){a1=toint(a.substr(2,a.size()-2))+n;b1=toint(b);}else if(b[0]=='A'){b1=toint(b.substr(2,b.size()-2))+n;a1=toint(a);}else{a1=toint(a);b1=toint(b); }G[a1][b1]=dis;G[b1][a1]=dis;}scanf("%d",&k);for(int p=0;p<k;p++){int ed;scanf("%d",&ed);dijkstra(ed,n+m);int end=-1;int min=INF;int street=0;for(int j=n+1;j<=n+m;j++){if(nums[j-n]>0){if(d[j]<min){end=j;min=d[j];}else if(d[j]==min){if(nums[end-n]<nums[j-n]){end=j;}else if(nums[end-n]==nums[j-n]){path.clear();temp.clear();streets=0;dfs(ed,end);street=streets;path.clear();temp.clear();streets=0;dfs(ed,j);if(street>streets){end=j;street=streets;}}}}}if(end==-1){printf("All Busy\n");continue;}path.clear();temp.clear();streets=0;dfs(ed,end);nums[end-n]--;int time=0;for(int i=0;i<path.size()-1;i++){time+=G[path[i]][path[i+1]];}for(int i=0;i<path.size();i++){if(path[i]>n){printf("A-%d",path[i]-n);}else printf("%d",path[i]);if(i!=path.size()-1) printf(" ");else printf("\n");	}printf("%d\n",time);}} 

小时候最害怕的一题,有两个测试点段错误,检查不出问题来了。

后来想想这道题可以用floyd来做,比每次都调用dijkstra逻辑上要清晰许多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128992.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVCJReble的使用文件的上传下载

目录 前言 一、JReble的使用 1.IDea内安装插件 2.激活 3.离线使用 使用JRebel的优势 二、文件上传与下载 1 .导入pom依赖 2.配置文件上传解析器 3.数据表 4.配置文件 5.前端jsp页面 6.controller层 7.测试结果 前言 当涉及到Web应用程序的开发时&…

AI人工智能Mojo语言:AI的新编程语言

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 Mojo的主要功能包括&#xff1a; 类似Python的语法和动态类型使Python开发人员易于学习Mojo&#xff0c;因为Python是现代AI / ML开发背后的主要编程语言。使用Mojo&#xff0c;您可以导入和使用任何Python库&#xf…

设计模式之外观模式

文章目录 影院管理项目传统方式解决影院管理传统方式解决影院管理问题分析外观模式基本介绍外观模式原理类图外观模式解决影院管理传统方式解决影院管理说明外观模式应用实例 外观模式的注意事项和细节 影院管理项目 组建一个家庭影院&#xff1a; DVD 播放器、投影仪、自动屏…

FPGA通信—千兆网(UDP)软件设计

一、PHY引脚功能描述 引脚功能描述1CLK25 CLK125:内部PLL生成的125MHz参考时钟&#xff0c;如MAC未使用125MHe时钟&#xff0c;则此引脚应保持浮动&#xff0c; 2 4 63 GND 接地3REG OUT开关压器&#xff0c;1.05V输出 5 6 8 9 11 12 14 15 MDI[0] MDI[0]- MDI[1] MDI[1…

Redis Redis介绍、安装 - Redis客户端

目录 redis是什么&#xff0c;他的应用场景是什么&#xff1f; Redis的一些主要特点和应用场景&#xff1a; redis的官方网站&#xff1a;Redis redis是键值型数据库&#xff1a;&#xff08;也就是key-value模式&#xff09;&#xff08;跟python的字典很像&#xff09; …

Web server failed to start. Port 8080 was already in use.之解决方法

问题&#xff1a; Web server failed to start. Port 8080 was already in use&#xff0c;这句错误描述意思是当前程序的端口号8080被占用了&#xff0c;需要将占用该端口的程序停止掉才行&#xff1b;错误如图所示&#xff1a; 解决方法&#xff1a; 按住winr&#xff0c;输入…

【大虾送书第九期】速学Linux:系统应用从入门到精通

目录 &#x1f36d;写在前面 &#x1f36d;为什么学习Linux系统 &#x1f36d;Linux系统的应用领域 &#x1f36c;&#xff11;.Linux在服务器的应用 &#x1f36c;&#xff12;.嵌入式Linux的应用 &#x1f36c;&#xff13;.桌面Linux的应用 &#x1f36d;Linux的版本选择 &a…

深入浅出PyTorch函数torch.rand与torch.randn

torch.rand 和 torch.randn 都是PyTorch中用于生成随机张量的函数&#xff0c;但它们生成随机数的方式有所不同。 一、torch.rand torch.rand 生成在区间 [0, 1) 内均匀分布的随机数。 size 参数是一个表示所需张量形状的元组或整数。可以生成任何形状的随机张量。 二、torch.…

C++的运算符重载介绍

所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对…

javaee springMVC model的使用

项目结构图 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

[EROOR] SpringMVC之500 回调函数报错

首先&#xff0c;检查一下idea里面的报错的原因&#xff0c;我的是jdk的版本的问题。所以更换一下就可以了。

JavaScipt中如何实现函数缓存?函数缓存有哪些场景?

1、函数缓存是什么&#xff1f; 函数缓存就是将函数运行的结果进行缓存。本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象。 缓存只是一个临时的数据存储&#xff0c;它保存数据&#xff0c;以便将…

平衡二叉搜索树(AVL)——【C++实现插入、删除等操作】

本章完整代码gitee地址&#xff1a;平衡二叉搜索树 文章目录 &#x1f333;0. 前言&#x1f332;1. AVL树概念&#x1f334;2. 实现AVL树&#x1f33f;2.1 结构定义&#x1f33f;2.2 插入&#x1f490;左单旋&#x1f490;右单旋&#x1f490;左右双旋&#x1f490;右左双旋 &a…

MySql系列-常用命令

基础知识-常用命令 命令不区分大小写 1、mysql连接 mysql -u username -p 实例: mysql -u root -p 2、元数据查询 //服务器版本信息 SELECT VERSION( ) //当前数据库名 (或者返回空) SELECT DATABASE( ) //当前用户名 SELECT USER( ) //服务器状态 SHOW STATUS //服务…

C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&a…

SpringMVC的文件上传文件下载多文件上传---详细介绍

目录 前言&#xff1a; 一&#xff0c;文件上传 1.1 添加依赖 1.2 配置文件上传解析器 1.3 表单设置 1.4 文件上传的实现 二&#xff0c;文件下载 controller层 前端jsp 三&#xff0c;多文件上传 Controller层 运行 前言&#xff1a; Spring MVC 是一个基于 Java …

ES-索引管理

前言 数据类型 ​ 搜索引擎是对数据的检索&#xff0c;所以我们先从生活中的数据说起。我们生活中的数据总体分为两种&#xff1a; 结构化数据非结构化数据 结构化数据&#xff1a; 也称作行数据&#xff0c;是由二维表结构来逻辑表达和实现的数据&#xff0c;严格地遵循数…

idea中mapper直接跳转到xml的插件

一.点击File | Settings | Plugins&#xff0c;下载插件 二、重启idea

分割等和子集【动态规划】

分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 class Solution {//testpublic boolean canPartition(int[] nums) {if(nums null || nums.length 0) return false;int n nums…