![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
2020复试
算法题
之虎者也
~
展开
-
PAT 甲级 1034 Head of a Gang【DFS】
用DFS求联通分量,再对每个连通分量进行判断判断1.多于两个判断2.总权达到阈值一开始犯了个错误以为名字都是样例里的AAA形式,实际上ABC这样形式也是可能的,然后就大改代码。。。应该要细心啊!!!//1034 DFSconst int maxn = 2005;int n,k,countt,w1,maxx,maxi;int G[maxn][maxn],vis[maxn],w[ma...原创 2020-04-21 21:29:55 · 104 阅读 · 0 评论 -
HDU 2084 数塔【DP】
找了个DP入门的数字三角形做做熟悉一下还能优化。优化:maxsum数组从二维优化成一维,只存最优结果再优化:maxsum数组也不要了,直接用d(i,j)的最后一行用来存结果//hdu 2084 数塔 数字三角形 DPint n,c;int maxsum[100][100],d[100][100];int main(){ scanf("%d",&c); w...原创 2020-04-20 19:39:28 · 99 阅读 · 0 评论 -
PAT 甲级 1031 Hello World for U【水题】
把一串字符串尽量按正方形输出,字符串不含空格是一道找规律的题目,而且题目已经把规律写明了,就是借助n1,n2,n3来完成本题char str[105];int main(){ int len,N,n1,n2; scanf("%s",str); len = strlen(str); N = len+2; n1 = N/3; n2 = N-n1...原创 2020-04-15 19:22:14 · 111 阅读 · 0 评论 -
PAT 甲级 1030 Travel Plan【最短路Dijkstra+dfs】
求两个点之间的最短路,输出路径,距离和花费单源最短路,用Dijkstra在这里插入代码片原创 2020-04-11 21:50:17 · 114 阅读 · 0 评论 -
PAT 甲级 1029 Median【归并】
贴两个AC代码:前一个是用merge()函数,偷个懒后一个是自己写的归并//代码1const int maxn = 200000 + 5;int n1,n2;long s1[maxn],s2[maxn];int main(){ scanf("%d",&n1); for(int i=0;i<n1;++i) scanf("%ld",s1+i); ...原创 2020-04-10 14:54:17 · 88 阅读 · 0 评论 -
PAT 甲级 1028 List Sorting【sort】
用C++的sort函数,这道题就是要写一个cmp函数AC代码在最下面ps:先说结论,涉及到连续操作内存的函数的时候,用char []不要用string。在做的过程中有个问题,如果结构体的变量char []换成string,在cmp中加入输出语句会发现一些为空的比较情况,换句话说就是stu[]这个结构体数组,在和sort函数产生传值的行为时,会有传不过去的情况。推测:问题应该和char [...原创 2020-04-09 17:08:07 · 83 阅读 · 0 评论 -
PAT 甲级 1027 Colors in Mars【进制、水题】
十进制转13进制//1027int a[6];char ans[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'};int main(){ int r,g,b; scanf("%d%d%d",&r,&g,&b); a[0] = r/13; a[1] = r%13;...原创 2020-04-08 18:22:08 · 87 阅读 · 0 评论 -
PAT 甲级 1024 Palindromic Number【模拟】
想偷懒用long long试试,果然只能A一部分,还是要模拟。1023模拟乘2,1024模拟大数加法。给的n小于10^10,k<100,一百次n的翻转相加后是存在爆ll的情况的。在这里插入代码片...原创 2020-04-08 18:02:54 · 156 阅读 · 0 评论 -
PAT 甲级 1023 Have Fun with Numbers【模拟】
首先20位说明long long也不行,所以要模拟乘以二的操作。具体讲一下乘2模拟:1.将每一位数乘以2的结果对10取余,存到对应位上2.得出进位数组,即每一位乘2后是不是需要进位3.对每个需要进的位,他的前一位应该要+1如下图所示(自己手写的一个):int cnt[11];char str[25];int up[25];//模拟进位的数组bool check(){ ...原创 2020-04-07 18:18:57 · 80 阅读 · 0 评论 -
PAT 甲级 1021 Deepest Root【DFS+BFS】
这道题没啥花里胡哨,就是基本的图(或者说树)的遍历。因为N是10^4,如果用邻接矩阵的话可能会超时,所以这里用的邻接表的存储方式。用dfs查连通分量数用bfs计算最深的根层数bfs计算层数使用的方法是在每一层的后面将一个特殊点入队作为层的分隔点,在本题中这个点就是0,因为结点都是大于0的。ps:我又来偷懒了,用set存结点就不用再排序了//DFS+BFSconst int maxn...原创 2020-04-05 23:07:06 · 98 阅读 · 0 评论 -
PAT 甲级 1020 Tree Traversals【二叉树遍历】
标准的模板题。给中后序输出层次遍历。之前博客:建树模板原创 2020-04-05 17:09:02 · 144 阅读 · 0 评论 -
PAT 甲级 1019 General Palindromic Number【水题】
给一个十进制数n和一个进制b。判断n转为b进制后是不是回文。并且用空格间隔打出这个数字。vector真是太好用了,不定长数组、栈、队列什么的都能用他写。//1019 判断回文,进制vector<int> a;bool jud(){ int t = a.size(); for(int i=0;i<t/2;i++){ if(a[i]!=a...原创 2020-04-04 20:07:58 · 85 阅读 · 0 评论 -
PAT 甲级 1018 Public Bike Management【Dijkstra+DFS】
求单源最短路,而且要求输出路径,非常完美的Dijkstra问题。用Dijkstra求出多条路径,再用DFS找到符合要求的路径。(题目保证有唯一解)一开始样例5和7过不了,是因为忽略了一个条件:后面的多余的车子不能补充前面的。我原来的算法是直接统计一条路上放出多少,收回多少直接抵消掉,这种算法就会导致后面的车子补充前面车子的情况出现。例如每个车站上限2量,现在路径上车的数量是0→2,这种情况应...原创 2020-04-03 21:50:53 · 102 阅读 · 0 评论 -
PAT 甲级 1017 Queueing at Bank【模拟】
跟之前一个题很像,也是排队,也是用队列。在这里插入代码片原创 2020-03-31 11:38:46 · 82 阅读 · 0 评论 -
PAT 甲级 1016 Phone Bills(没A,存档一下)
计算每月花费账单给出一天24小时的收费标准,单位cents/minute。算出每个用户的月账单。对每个on-line记录,找时间上最近的off-line记录匹配。原创 2020-03-27 20:30:36 · 122 阅读 · 0 评论 -
PAT 甲级 1015 Reversible Primes【水题】【素数、进制】
这道题意思是给定数N和进制R,把N转换成R进制数后再逆置一下得到N1,如果N和N1都是素数就输出yes,否则输出No。思路:打一下表,转换一下机制判断一下就行了,应该没什么坑,写了一遍交了就过了。代码://1015 进制转换 质数int a[20],i,prime[100005];void radix_change(int x,int radix){ //除r取余法转进制 ...原创 2020-03-22 23:45:24 · 70 阅读 · 0 评论 -
PAT 甲级 1014 Waiting in Line【queue】
排队场景,用队列实现即可。具体思路:前n*m个人直接按顺序安排上,并不需要把人安排到先办完业务的人后头,只需要看队伍人数就行(一开始就错在这里3和4样例过不去)。然后黄线后面的人,从黄线内的队伍找,出去一个进来一个就行了。坑点提示:如果某个人17:00前开始办业务就可以完成,以张三为例,张三16:00排上队开始办理业务,但是需要办1个小时10分钟,也就是17:10才完成,这种情况也算完成,但是...原创 2020-03-22 22:36:43 · 130 阅读 · 0 评论 -
PAT 甲级 1013 Battle Over Cities【DFS】
题意:战争爆发了,要保证所有城市的连接。但是,一旦某个城市被占领了,那这个城市和其他城市的连接就断开了。现在要求在某些城市被占领的情况下,需要修多少路保证其他城市的连接。比如3个城市123,有1-2和1-3两条路,如果1被占领了,这两条路就都断了,为了保证2和3连接,需要建一条路。解:求一个图在断开某些连接情况下的连通分量个数。再减去2就是答案了,为什么-2呢?首先孤立出来被占领的城市构成一...原创 2020-03-18 18:55:15 · 75 阅读 · 0 评论 -
PAT 甲级 1012 The Best Rank【水题】
大晚上写的,代码有点乱。题目是处理数据的,不难。一开始前两个样例没A,是我想错了。我以为是看每个学生最好的那一科排第几,应该是:看这个学生哪一个科排名最高。int gra[2005][5],n;char g[] = {'C','M','E','A'};int find_stu(int i){ int t; bool nothave = true; for(i...原创 2020-03-16 22:42:03 · 83 阅读 · 0 评论 -
UVa 10954 Add All 【Huffman编码】【复习优先队列】
又是学习紫薯的一天~https://vjudge.net/problem/UVA-10954很明显是个Huffman编码问题这道题内容上比较简单,n比较小,用一个优先队列就可以实现优先队列:优先队列在头文件<queue>中,用priority_queue<int> pq来声明。这个pq是一个越小的整数越优先级越低的优先队列。出队不再和普通队列一样看入队顺序,而是看...原创 2020-03-16 16:24:20 · 107 阅读 · 0 评论 -
POJ 1804 Brainman【归并排序】【逆序对】
求把一个序列通过两两交换变成有序序列需要的交换次数。原创 2020-03-16 15:26:30 · 107 阅读 · 0 评论 -
PAT 甲级 1011 World Cup Betting 【水题】
输入并计算一下乘法输出就完事了//1011int main(){ double a[3]; char b[3],c[] = {'W','T','L'}; double maxn0,maxn1,maxn2; while(scanf("%lf %lf %lf",a,a+1,a+2)!=EOF){ maxn0 = a[0]; fo...原创 2020-03-15 22:01:50 · 72 阅读 · 0 评论 -
PAT 甲级 1010 Radix【二分】
这个题后台判题有20个样例。。。这道题用这么多样例,及其周全地考察程序的健壮性:1.考虑溢出的情况,int不行,用long long int,而且long long也会溢出2.考虑复杂度的情况,暴力会超时,要二分3.字符数组开小了,开多5个就多A了三个样例,暂不知为何刚开始直接循环找,超时,通过了四五个样例。。。改成二分,通过了一半,还有一半样例超时。。。原来是写错了一些地方。。。...原创 2020-03-09 15:14:43 · 178 阅读 · 0 评论 -
PAT 甲级 1009 Product of Polynomials【水题】
醉了,一开始错是因为把≤1000看成了<1000,结果5个样例错3个,改过来就A了//1009double a[1005],b[1005],c[2005];int main(){ int n,m,t1; double t2; while(scanf("%d",&n)!=EOF){ memset(a,0,sizeof(a)); ...原创 2020-03-08 16:38:45 · 91 阅读 · 0 评论 -
PAT 甲级 1008 Elevator【水题】
刚开始看错了,以为给的数字都是楼层,我说呢,怎么都不能理解41是怎么来的。把写错的代码贴在这,正好复习一下stringstream和getline的用法//如果给的数字都是楼层可以这么做,main函数里:string str;while(getline(cin,str)){ int a,bf = 0,sum = 0; stringstream ss; ss<&...原创 2020-03-08 15:57:30 · 114 阅读 · 0 评论 -
UVa 816 Abbott's Revenge【BFS】【迷宫】
https://vjudge.net/problem/UVA-816分析输入:SAMPLE3 1 N 3 31 1 WL NR *1 2 WLF NR ER *1 3 NL ER *2 1 SL WR NF *2 2 SL WF ELF *2 3 SFR EL *0WLF的意思是,有个告示牌,从West西方向来的人能看到,他们可以选择向L和F走,也就是左转或者直行。然后输...原创 2020-03-08 14:10:23 · 149 阅读 · 0 评论 -
UVa 548 Tree【根据遍历序列建二叉树模板】
参考紫书代码,作为根据遍历序列建树的模板掌握起来。代码是中后序建树,先中序建树一样,只需要稍微改动一下就行了建树部分://把in_order[L1...R1]和post_order[L2...R2]建成一棵二叉树,返回树根//其实是个找根然后划分左右子树继续找根的递归过程int build(int L1,int R1,int L2,int R2){ if(L1>R1) re...原创 2020-03-07 13:21:23 · 105 阅读 · 0 评论 -
PAT 甲级 1007 Maximum Subsequence Sum【水题,注意一个超时样例】
求最大连续子序列,一开始我是直接三重循环算的。。但是最后一个样例超时。其实不用三重循环,二重循环就可以算出来了,三重循环相当于多计算和比较了许多次。for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ sum += a[j]; if(a[i]<0) con...原创 2020-03-06 21:55:42 · 142 阅读 · 0 评论 -
PAT 甲级 1004 Counting Leaves【n叉树层次遍历】
还是代码写的少,有点手生,写了好久。。。。题目很明了,求一个家族树上每一代人有多少没有孩子的,就是求树的每一层上有多少没有子结点的,层次遍历计数就好了。//1004//数组a用来存数据,第一个维度指结点编号,第二个维度中a[i][0]表示结点i是否有孩子//a[i][1]为k,a[i][2]以及以后表示i结点的所有孩子编号int a[100][205];int main(){ ...原创 2020-03-06 11:29:50 · 182 阅读 · 0 评论 -
UVa 122 Trees on the level【层次遍历】
很明显,题目要求层次遍历,用队列实现。紫书代码(极好的模板)://UVa 122 层次遍历二叉树const int maxn = 256;char s[maxn];bool failed;vector<int> ans;//结点类型struct Node{ bool have_value; int v; Node *left,*right;...原创 2020-03-06 09:06:21 · 96 阅读 · 0 评论 -
UVa 679 Dropping Balls【完全二叉树】
乍一看完全二叉树用一个数组模拟一下就行了,实则如此做复杂度太高。其实每个根都有两种状态,相邻的小球肯定去了不同的子树,比如4个球就有两个去了左子树,两个去了右子树。那么对于分别的子树来说,就相当于有两个球来到了这个子树的根,所以不用模拟,结果只跟奇偶性有关。//UVa 679 完全二叉树int main(){ int D,I,n; while(scanf("%d",&am...原创 2020-03-03 22:06:10 · 103 阅读 · 0 评论 -
UVa 11988 Broken Keyboard (a.k.a. Beiju Text)【链表】
读了半天题,没看懂什么意思。然后发现是这样的,home和end键按下去后会回到这一行的开始和结束。如果不知道这个可能不会读懂题目。(这俩键平时也没人用啊,在键盘的角落上,出个题也不解释一下)下面说题:数组复杂度太高,超时,用链表。也就是说,一旦按下home键,之后的文字就接在头部,一旦按下end键,之后的文字就接在尾部,这样就简单了。根据home和end来构建一个链表,用next数组表示...原创 2020-03-03 15:53:14 · 121 阅读 · 0 评论 -
PAT 甲级 1006 Sign In and Sign Out 水题
1.注意char*和string的关系。2.strcmp(str1,str2),若str1=str2,返回零;若str1<str2,返回负数;若str1>str2,返回正数。char a[1000][20];int main(){ int m,n,p; char* first="23:59:59"; char* last="00:00:00"; ...原创 2020-03-01 17:59:11 · 67 阅读 · 0 评论 -
PAT 甲级 1005 Spell It Right 水题
//1005char a[105];char* num[] = {"zero","one","two","three","four","five","six","seven","eight","nine"};stack<char*> out;int main(){ while(scanf("%s",a)!=EOF){ int sum=0; ...原创 2020-03-01 13:28:42 · 134 阅读 · 0 评论 -
UVa 572 Oil Deposits + PAT 1003 Emergency 两道DFS题
1.UVa 572紫书题目,作为熟悉DFS之用//dfs uva572const int maxn = 100 + 5;char pic[maxn][maxn];int m,n,idx[maxn][maxn];void dfs(int r,int c,int id){ if(r<0||r>=m||c<0||c>=n) return; //出界的格子 ...原创 2020-03-01 00:54:27 · 185 阅读 · 0 评论 -
PAT 甲级 1001-1002 水题两道
题目地址:https://www.patest.cn/practice1001:没想到第一题就有小坑,看题目还以为是随便一个A+B problemTips:输入1000 0试试就知道自己为什么部分通过了int main(){ int m,n,ans,a[10],p; while(scanf("%d %d",&m,&n)!=EOF) { ...原创 2020-02-27 21:30:35 · 188 阅读 · 0 评论 -
【模板/子功能】全排列、子集生成三法、回溯法常见用法
1.求全排列void print_permutation(int n,int* A,int cur){ if(cur==n){ //递归边界 for(int i = 0;i<n;i++) printf("%d",A[i]); printf("\n"); } else for(int i = 1;i<=n;i++){ ...原创 2020-02-21 16:17:54 · 124 阅读 · 0 评论 -
UVa 10976 Fractions Again?!【暴力-枚举】
题目地址:https://vjudge.net/problem/UVA-10976题目分析:将一个分数拆分,输出所有的拆分结果。由于要先输出个数,所以要用数组暂存再输出。int main(){ int k,x,cnt,a[1000],b[1000]; while(scanf("%d",&k)!=EOF){ //i就是y cnt = ...原创 2020-01-19 18:58:01 · 148 阅读 · 0 评论 -
UVa 11059 Maximum Product 【暴力-枚举】
题目地址:https://vjudge.net/problem/UVA-11059题目分析:要求得到输入的数字序列中连续的乘积最大值。思路:对每段序列的值枚举计算就行了。AC代码:int main(){ int n,t=1,num[20]; long long maxx=0,cnt; while(scanf("%d",&n)!=EOF&&n...原创 2020-01-19 17:30:45 · 117 阅读 · 0 评论 -
UVa 725 Division 【暴力-枚举】
题目地址:https://vjudge.net/problem/UVA-725题目分析:输入n,要求得到abcde/fghij = n,的abcde和fghij,这两个数的每位数占0-9中10个数字的一个且不重复。思路:循环判断每个fghij,判断是否满足要求即可。注意fghij = abcde/n,所以循环从1234到98765/2就可以了。AC代码:int temp[10];int...原创 2020-01-19 17:22:34 · 206 阅读 · 0 评论