PTA刷题记录

9.8号考试,需要刷完155道题!
记录不会做的题 & 学到的算法 & 一些比较trick的技巧

8.13
1013 Battle Over Cities
题目大意:n个城市,m条道路,k个询问,每次询问时有一个城市被敌军占领,不可通过,问此时需要修几条路可以保证剩余城市彼此之间可达。
用并查集做超时了…
用map记录下各个城市之间的连接关系,然后用dfs求联通分量的个数,被敌军占领的城市,vis置为1即可。

1014 Waiting in Line
输出左补零的方法,printf("%04d", num)

8.14
定义vector嵌套的方法
vector< vector<\int> >v 空格很重要

1007 Maximum Subsequence Sum
最大连续子序列和,需要记录该连续子序列的起始和结束位置。

1018 Public Bike Management
先用dijstra求出最短路径,需要保存多条最短路径,保存的方法就是每个节点有一个pre vector,记录最短路径下,该点的前一个点都可以是什么,然后用dfs遍历,可以获得所有的最短路径。
当有多条最短路径的时候,首先选取需要从总站取出最少的自行车的路径,如果仍然存在多条,就选择需要带回总站最少的自行车的路径。
这个过程是单行的,need和back的自行车数要随时更新,可以先记录每个点与perfect状态的差值,然后在遍历路径的时候动态更新need和back。

8.18
1021 Deepest Root (25 分)
题意:一个联通的、非循环的图可以称之为树,选取树的根节点不同,则树的深度也不同,给定图的点的个数n,给出n-1条边的起始点,求出树深最深的根节点,如果有多个就全部输出,如果该图不连通,就输出联通分量的个数。
思路:因为给出了n-1条边,所以,如果是树,就刚好是全部联通,先用dfs判断连通分量的个数,然后以每一个点为起始做dfs(记录每个点的深度),然后记录最深的深度,然后求出最深的深度,把最深的深度的root点输出。
练习的点:dfs求连通分量

1022 Digital Library
大型模拟,有一组数据怎么都过不了…崩溃…

1029 Median
这个题竟然卡了我这么长时间…两个不降序排列的数组,求其总共的中位数,只能保存一个数组,在线处理另一个数组,最关键的是,一个数组处理完了之后可能另一个数组还没有完,需要继续处理。

int i;
for(i=0;i

8.19
1032 Sharing
表面考察链表的存储,实际上可以用非常简单的方法解,只需要记录第一个链表的路径,将其设置为1,然后再第二个链表的时候,只要遇到为1即输出。

1033 To Fill or Not to Fill
贪心,好题!值得二刷!

8.20
1037 Magic Coupon
给出两个数组,都有各有正负,从其中各选一个数相乘,结果累计,每个数至多选一次,要求最终的和最大。
思路:排序,之后正数跟正数相乘,负数跟负数相乘,这样得到的都是正数,选择的时候一定要注意,两个数组一起处理,否则要考虑到两个数组长度不一定相等的问题,有可能处理完其中一个,另一个还没有处理完,这个问题在需要处理两个数组的时候都需要注意。

1038 Recover the Smallest Number
嗯…

8.21
1044 Shopping in Mars
一串数字,要求一个连续的子序列,使之和恰好为m,如果不能够恰好为m,则求大于m的最小的一段,好题!直接枚举起点终点会超时。
法1:遍历起点,二分法求终点。
法2:遍历终点,其中如果终点都小于m了,其子序列也一定小于m,则不需要遍历,否则的话求出当前终点,最小的大于m的起点。

1048 Find Coins
这个题与上一个题目类似,可以用二分法求,也可以用更简单的hash散列,注意一下写二分的时候有坑点。

8.23
1095 Cars on Campus
询问的时候的时间是有顺序的,所以是可以累加前面的结果的,好题

8.24
1059 Prime Factors
涉及到素数打表问题

1065 A+B and C (64bit)
64bit 的long long的存储范围是(-2^63, 2^63)利用溢出来判断结果的题目

8.26
1066 Root of AVL Tree
AVL-tree 裸题

8.27
1071 Speech Patterns
判断一个字符是否为数字或字母,可以用cctype函数中的isalnum,然后字符串操作是+,清空为“”。变为小写为tolower
在处理一行字符串的时候,要记得处理好结尾,结尾无论是什么都要把当前合格的字符串放进map。

1072 Gas Station
dijstra,string类型转换成int有个函数是stoi,还有个函数是fill

int map[1020][1020];
const int maxint=9999999;
fill(map[0],map[0]+1020*1020,maxint);
int dis[1020];
fill(dis,dis+1020,maxint);

如果用dev-c++编译环境,没法用stoi的话,就在tool-compiler options里面加“-std=c++11”

8.28
1085 Perfect Sequence
同1095 答案是可以利用前面的结果的。
我需要写一下二分查找的一些问题。

1089 Insert or Merge
要会写插入排序和归并排序

1079 Total Sales of Supply Chain

pow(m,n); //结果为m^n

8.29
1010 Radix
这个题目的含义是给定两个数和其中一个数的进制,问是否存在一个进制赋给另一个数,使得两个数大小相等。
每个数的大小不超过10位。每位都是0-9或a-z,给定的进制不超过36,但是另一个数的进制可以随便取。

char t=*max_element(s.begin(),s.end())
isdigital(t)

1016 Phone Bills
一个巨大的模拟题

8.30
1103 Integer Factorization
题目大意:给定一个数N,求K个数的P次方的和恰好是N(K个数可以存在重复),输出为这K个数的降序排列,如果解不唯一,就取这K个数的和最大的一组,如果解还不唯一,就取较大的序列,若不存在满足条件的K个数的序列,则输出impossible。其中,N<=400,1 解法:这是一道典型dfs回溯题,枚举K个位置每个位置可能的数。

void dfs(int num, int cur, vector&path)

这个dfs需要记录当前进行到哪个位置,以及所剩的num
终止条件:当cur==k的时候,num应该为0
剪枝条件:1.枚举下一个位置的数的时候

int minum=cur>0?:path[cur-1]:1;
int maxnum=sqrt(num);

因为枚举的过程是递增的,所以如果当前的i的P次方都比剩余的num小,就不需要枚举后面的了

因为使用vector记录path,vector push_back之后不能取出来,所以应该用cur去控制数组下标的位置

vectorpath(k) //申请一个k大小的数组,这样就可以访问0-k-1的下标了

8.31
1104 Sum of Number Segments

9.1
1108 Finding Average

char a[50],b[50];
double temp;
scanf("%s",a);
sscanf(a,"%lf",temp); //从字符串中读入指定格式的数据
sprintf(b,".2lf",temp); //将指定格式的数据写入到字符串中

1110 Complete Binary Tree
判断一棵二叉树是否为完全二叉树:假设root节点的编号为1,然后dfs遍历每个节点的左右孩子节点,左右孩子节点的编号为num2,num2+1,这样到最大的节点的编号即为节点个数,就是一棵完全二叉树,否则就不是。

1122 Hamiltonian Cycle
判断哈密顿环

9.2
1126 Eulerian Path
欧拉回路-欧拉通路的判断,记得加一个判断——这个图是否为连通图!

1128 N Queens Puzzle
N皇后问题
在判断是否为攻击的时候

bool vis[3][N];
vis[0][pos]==0&&vis[1][j+pos]==0&&vis[2][j-pos+N]==0//必须保证三个条件都没有攻击

9.4
1141 PAT Ranking of Institutions

string line;
for(i=0;i

如果是小数累加最后取整数部分的话,一定要先累加再取整,不然会损失很多。

1145 Hashing - Average Search Time&1078 Hashing
哈希散列处理冲突,用二次方探测的方法

for(i=0;i

1151 LCA in a Binary Tree
二叉树的LCA

/*如果当前点的data等于u,v其中一个数据,则其中一个是另一个的父节点,否则的话继续寻找,如果u,v分列在两侧,则最近公共祖先就是root,否则就在其中一颗子树上 */
Node* lca(Node *root,int u,int v)
{
	if(root==NULL)
		return NULL;
	if(root->data==u||root->data==v) 
		return root;
	Node *left=lca(root->lchild,u,v);
	Node *right=lca(root->rchild,u,v);
	if(left&&right)
		return root;
	left==NULL?return right:return left;
}
#include
#include

string num;
reverse(num.begin(),num.end());

9.5
1034 Head of a Gang
用并差集和dfs求联通块都可以做

1052 Linked List Sorting
注意一下,有可能这个链表是空的,什么都没有,li.size()==0,其实所有的需要统计的问题都可能存在结果为0的情况,要注意。

1073 Scientific Notation
科学计数法 需要再整理一下思路。

你可能感兴趣的:(攒题)