(长期更新‘’‘’‘2018/8/17)CCF 模拟题-----(python3)

今年即将到来的九月CCF考试新增了python3语言。

准备用python3参加考试,找了一圈,网上对模拟题的解答没有python的代码,于是自己动手用python3刷题。

在此贴出原创的18年3月的python3代码。

第一题--跳一跳

分析:水题,没有任何坑和难点。看懂题、稍有编程基础和逻辑思维即可完成。

#跳一跳
string=input().split()
out_sum=0
mul_flag=1
for i in string:
	if int(i)==1:
		out_sum+=1
		mul_flag=1
	if int(i)==2:
		out_sum+=mul_flag*2
		mul_flag+=1
	if int(i)==0:
		break
print(out_sum)	

第二题---碰撞的小球

分析:难度中等的一道模拟题。乍一看比较复杂像是个物理题,实际分析的结果比较简单,因为不论怎么碰撞,每个球的相对位置不会改变。解题的思路是用while循环让time递减,在每次循环里对每个球进行判断和操作。只需要对每个球设置一个flag,判断是否发生了碰撞,发生就反向。这里注意的是flag不要取0和1,取1和-1,发生碰撞则flag=-flag直接加和flag即可。
这题我还是想复杂了,由于被第一个测试用例误导,我的思路是对既有的有序的位置数组进行查询和修改,后来考虑到给定的输入里小球的位置可以不是有序的,就想着先对位置进行排序再按照数组递增的方式查询修改。所以用了一个字典类型来存储小球的输入编号和当前位置以及对应的speed(即上述的flag)。然后对输入序列依照小球位置进行排序,最后在分别对首尾中三种位置的球进行查询和修改操作。

我这种方法在这里有个小坑,需要单独考虑只有一个球的情况,因为当只有一个球,数组不存在list_doc[i+1]。

虽然这种方法最后还是AC了这道题,但是自己也觉得麻烦。在CSDN上看了一篇其他博主的c++解题分析,恍然大悟,根本不需要对球进行排序,就直接对数组进行查询修改即可。下面贴出来参考博客的链接。

https://blog.csdn.net/BeforeEasy/article/details/80081890

num,lenth,time=map(int,input().split())
s=input().split()
print(s)
list_doc=[]
for i in range(num):
	list_doc.append({})
	list_doc[i]['number']=i
	list_doc[i]['value']=int(s[i])
	list_doc[i]['speed']=1
for i in range(num):					#一个冒泡排序对小球位置排序,同时保留输入的顺序number
	for j in range(i+1,num):
		if(list_doc[i]['value']>=list_doc[j]['value']):
			p=list_doc[i]
			list_doc[i]=list_doc[j]
			list_doc[j]=p
site=[]
for i in range(len(s)):
	site.append(list_doc[i]['value'])
while time>0:
	for i in range(num):
		if num==1:
			if list_doc[i]['value']==0 or list_doc[i]['value']==lenth:
				list_doc[i]['speed']=-list_doc[i]['speed']
			site[i]+=list_doc[i]['speed']
			site[i]=abs(site[i])
		else:
			if i==0:
				if list_doc[i]['value']==0 or list_doc[i]['value']==list_doc[i+1]['value'] or list_doc[i]['value']==lenth:
					list_doc[i]['speed']=-list_doc[i]['speed']
				site[i]+=list_doc[i]['speed']
				site[i]=abs(site[i])
			elif i==len(s)-1:
				if list_doc[i]['value']==list_doc[i-1]['value'] or list_doc[i]['value']==lenth:
					list_doc[i]['speed']=-list_doc[i]['speed']
				site[i]+=list_doc[i]['speed']
				site[i]=abs(site[i])	
			else:
				if list_doc[i]['value']==list_doc[i+1]['value'] or list_doc[i]['value']==list_doc[i-1]['value'] or list_doc[i]['value']==lenth:
					list_doc[i]['speed']=-list_doc[i]['speed']
				site[i]+=list_doc[i]['speed']
				site[i]=abs(site[i])
	for i in range(num):
		list_doc[i]['value']=site[i]
	time-=1
for i in range(num):					#一个冒泡排序对小球原始顺序排序,同时保留输出的value
	for j in range(i+1,num):
		if(list_doc[i]['number']>=list_doc[j]['number']):
			p=list_doc[i]
			list_doc[i]=list_doc[j]
			list_doc[j]=p		
for i in range(num):
	 if i!=num-1:
	 	print(list_doc[i]['value'],end=' ')
	 else:
	 	print(list_doc[i]['value'],end='')

“今天复习一天有点累,脑袋不太清醒,没精力做其他的事,就想着把这段时间写的代码再回顾一遍。”

就先更新到这里。。。。过几天有机会再把上述的新方法实现一遍,并把第三四题的代码和分析贴出来。(第五题实在是无能为力,考试也不打算写了,时间根本不够 )

考研加油!!!

你可能感兴趣的:((长期更新‘’‘’‘2018/8/17)CCF 模拟题-----(python3))