刷PAT甲级的各题思路、细节以及遇到的问题记录

1001 A+B Format (20分)

因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called。

1002 A+B for Polynomials (25分)

循环输入累加即可,只不过要注意题目中所说where K is the number of nonzero terms in the polynomial,也就是不能有0的项,所以一定要在累加时加一个是否为0的判断,而题目还要求**Please be accurate to 1 decimal place.**也就是保留一位小数.

1003 Emergency (25分)

其实就是在Dijkstra算法的基础上加了一些数据,将这些数据随着算法进行更新即可(这里可能不止一条最短路径!!!),值得注意的是题目中要求输出的是最短路径的条数以及最短路径中救援队(点权)之和中的最大值,千万不要被例子误导,因为例子中的最短路径的条数和最短路径长度相同。

1004 Counting Leaves (30分)

因为题目中说For the sake of simplicity, let us fix the root ID to be 01. 也就是简单起见,根节点的id就是01,这就很方便了,01就是递归的入口。
显然我们的输入是很多个分支(仅有两层:一个父节点和其子节点),而我们要找到每层的叶子结点数从01的子节点开始遍历找起即可,01就是第0层。对于没有子节点的结点,当前层数的叶子结点数+1,如果有子节点,接着遍历其子节点,别忘了层数+1。

1005 Spell It Right (20分)

N (≤10​100). 故N必须声明为字符串类型,再求各位和。

1006 Sign In and Sign Out (25分)

像类似于题目中时间HH:MM:SS这种特殊格式,完全可以用scanf("d%:%d:%d:".....)的格式以整型数据输入时间,而不是用字符串输入再去麻烦的转换。此外,比较时间也不必时分秒逐个比,直接统一成秒比较即可。

1007 Maximum Subsequence Sum (25分)

很典型的最大子序列和问题。题目说 In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case),结果不唯一,只要求输出最小的i和j,因此边输入边计算即可。还有If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence. 别忘了最后判断一下结果是否小于0,小于0说明序列中所有元素都小于0,此时最大子序列和应为0。并且输出的是序列数,不是下标!!!

1008 Elevator (20分)

主要还是题意的理解:开始在第0层,每上升一层用6s,每下降一层用4s,到达目的楼层后停留5s,随着输入累加时间即可。要注意的是没说不能从同一楼层到同一楼层,所以不管什么情况都要等5s。

1009 Product of Polynomials (25分)

和1002 A+B for Polynomials (25分)非常相似,但注意这里变了,1002 A+B for Polynomials (25分)时所有Ni相同的项合并为一个,而这里是两行数都两两配对,配对后的Ni的和相同的会合并,所以我们不能在两重循环中累积运算了,必须分两次循环进行,同样一定要在累积时加一个是否为0的判断

1010 Radix (25分)

有点意思,一开始被can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.,给我搞蒙了,这句话的意思是二进制的6等于110,然而我理解成了十进制的6和二进制的110是一样的。但是本质的问题就是给你一个数N1和它的进制,让你去找另外一个数N2是哪种进制时和N1相等。其实已经暗示了边界值,最大的进制应该是N1。

1011 World Cup Betting (20分)

没什么东西,按部就班的按照题意来就行。

1012 The Best Rank (25分)

把所有的数据存成结构体按部就班的排序即可,不过要注意的是对于一个科目中相同分数的排序应该是1、1、3、4、5,而不是1、1、2、3、4,所有排序后在相等时的rank等于上一个分数的rank。此外题目中说The priorities of the ranking methods are ordered as A > C > M > E.,所以储存时就按ACME的顺序存储会省很多事。

1013 Battle Over Cities (25分)

意思就是给出n个城市之间有相互连接的m条道路,当删除一个城市和其连接的道路的时候,问其他几个剩余的城市至少要添加多少个路线才能让它们重新变为连通图。
添加的最少的路线,就是他们的连通分量数-1,因为当a个互相分立的连通分量需要变为连通图的时候,只需要添加a-1个路线,就能让他们相连。所以这道题就是求去除了某个结点之后其他的图所拥有的连通分量数。
使用邻接矩阵存储,对于每一个被占领的城市,去除这个城市结点,就是把它标记为已经访问过,这样在深度优先遍历的时候,对于所有未访问的结点进行遍历,就能求到所有的连通分量的个数,记得每一次输入被占领的城市之前要把visit数组置为false(重置)

1014 Waiting in Line (30分)

题目真的长,要注意的是如果一个客户在17:00以及以后还没有开始服务就不再服务输出sorry;如果这个服务已经开始了,无论时间多长都要等他服务完毕。所以对于当前要进入黄线的人的服务结束时间的计算应当放在判断黄线前最后一个人的结束时间是否超过17:00,如果超过就可以sorry了。此外,初始化是对前n*m个客户进行的,之后就会不停判断哪个窗口最先有空位,然后等待序列中的第一个客户进入空位,直到所有客户入队。
注意这里为了判断结束方便才让所有客户入队,并不是所有客户都能得到服务。

1015 Reversible Primes (20分)

别只顾着转换后的数,原来的数也必须是素数。还有0和1不是质数。

1016 Phone Bills (25分)

是真的麻烦,关键是题意的理解,给出的24小时中每个小时里每分钟的费用是多少美分,输出的是美元,我吐了。
所以在计算费用时:

//计算费用,这里默认输入的是a比b大,rate中存放的是每小时美分数
double calculateCost(Record a,Record b,int rate[])
{
   
	double result=0.0;
	int sum_day=0;//打一整天费用
	for(int i=0;i<24;i++){
   
		sum_day+=rate[i]*0.01*60;
	}
	//天数
	result+=(a.dd-b.dd)*sum_day;
	//小时
	if(a.hh>b.hh){
   
		for(int i=b.hh;i<a.hh;i++){
   
			result+=rate[i]*0.01*60;
		}
	}else{
   
		for(int i=a.hh;i<b.hh;i++){
   
			result-=rate[i]*0.01*60;
		}
	}
	 //分钟 
	result-=b.mm*rate[b.hh]*0.01;//多的减去
    result+=a.mm*rate[a.hh]*0.01;//少的加上
	return result;
}

1017. Queueing at Bank (25)

用一个结构体存储客户的到达时间和办理业务时间~首先把所有hh:mm:ss格式的时间全化成以当天0点为基准的秒数。注意晚于17:00的客户不算在内,因为我们同时存了到达时间和办理时间,所以下一个客户的等待时间就是他到来的时间减去上一个客户办理结束的时间(在前者小于后者的前提下)。我们可以把每个客户办理完的时间放入优先队列中,这样我们甚至不需要管每个窗口怎么样,直接一直用队首(上一个客户办理结束的时间)和下一个客户到来的时间比即可,如果前者大,那么就需要计算等待时间,如果前者小或二者相等,那么只用把其

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值