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<m;i++)
{
	scanf("%d",&temp);
	while(k[j]<temp)
	{
		cnt++;
		if(cnt==mid_pos)
			cout<<k[j]<<endl;
		j++;
	}
	cnt++;
	if(cnt==mid_pos)
		cout<<temp<<endl;
}

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<P<=7
解法:这是一道典型dfs回溯题,枚举K个位置每个位置可能的数。

void dfs(int num, int cur, vector<int>&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去控制数组下标的位置

vector<int>path(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<line.size();i++)
	line[i]=tolower(line[i]); //toupper()

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

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

for(i=0;i<tsize;i++)
{
	int pos=temp+i*i;
	if(table[pos]==0)
	{
		//放置成功
		break;
	}
}

for(i=0;i<=tsize;i++)
{
	int pos=temp+i*i;
	if(table[pos]==temp||table[pos]==0)
	{
		//找到了或者寻找失败了
		break;
	}
}

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<algorithm>
#include<string>

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
科学计数法 需要再整理一下思路。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PTA_基础编程答案_整章 包括但不限于如下 7-1 厘米换算英尺英寸 15 27785 103313 0.27 7-2 然后是几点 15 20063 78572 0.26 7-3 逆序的三位数 10 24732 62644 0.39 7-4 BCD解密 10 14066 23357 0.60 7-5 表格输出 5 15169 36439 0.42 7-6 混合类型数据格式化输入 5 15719 36076 0.44 7-7 12-24小时制 15 14687 51855 0.28 7-8 超速判断 10 15328 39238 0.39 7-9 用天平找小球 10 15145 33252 0.46 7-10 计算工资 15 14241 35238 0.40 7-11 分段计算居民水费 10 12907 35261 0.37 7-12 两个数的简单计算器 10 12912 33359 0.39 7-13 日K蜡烛图 15 9280 34024 0.27 7-14 求整数段和 15 11461 55664 0.21 7-15 计算圆周率 15 9826 33135 0.30 7-16 求符合给定条件的整数集 15 8986 21898 0.41 7-17 爬动的蠕虫 15 9739 24881 0.39 7-18 二分法求多项式单根 20 7282 31752 0.23 7-19 支票面额 15 7375 21837 0.34 7-20 打印九九口诀表 15 10325 35138 0.29 7-21 求特殊方程的正整数解 15 7799 22600 0.35 7-22 龟兔赛跑 20 7446 29142 0.26 7-23 币值转换 20 4333 18467 0.23 7-24 约分最简分式 15 6728 15335 0.44 7-25 念数字 15 6724 20180 0.33 7-26 单词长度 15 5648 37409 0.15 7-27 冒泡法排序 20 7255 24045 0.30 7-28 猴子选大王 20 6144 13327 0.46 7-29 删除字符串中的子串 20 4798 15074 0.32 7-30 字符串的冒泡排序 20 4752 14741 0.32 7-31 字符串循环左移 20 4527 13605 0.33 7-32 说反话-加强版 20 4030 25470 0.16 7-33 有理数加法 15 4476 10862 0.41 7-34 通讯录的录入与显示 10 4323 19524 0.22 7-35 有理数均值 20 3281 17202 0.19 7-36 复数四则运算 15 2530 10103 0.25 7-37 整数分解为若干项之和 20 2437 4673 0.52 7-38 数列求和-加强版 20 4692 35190 0.13 当前显示1 - 38项,共38项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值