这题看题目都看了好久,解法其实不难,但我只能完成60%,python运行的太慢了,老是超时,恰个烂分算了。
需要注意的就是怎么对指定列表范围进行排序。
a = input().split()
n = int(a[0])
m = int(a[1])
xulie = [i+1 for i in range(n)]
for i in range(m):
b = input().split()
leixing = int(b[0])
canshu = int(b[1])
if leixing == 0:
xulie = sorted(xulie[:canshu],reverse=True) + xulie[canshu:]
else:
xulie = xulie[:canshu-1] + sorted(xulie[canshu-1:])
for x in xulie:
print(x,end=' ')
试题 历届真题 左孩子右兄弟【第十二届】【省赛】【A组】
树早忘完了,比赛时候遇到这题摆烂算了
网上找了别人的代码,仔细看了一遍,起码学会了python怎么构造树,后面看看遇到类似题对比着练习一下吧
class node:
def __init__(self,val):
self.val = val
self.child = []
n = int(input())
tree = [None,node(val = 0)]
for i in range(2,n+1):
print(tree)
m = int(input())
tree.append(node(val = m))
tree[m].child.append(i)
def maxlen(n:node):
if len(n.child):
return len(n.child) + max(maxlen(tree[tmp]) for tmp in n.child)
return 0
print(maxlen(tree[1]))
卡片
【问题描述】
小蓝有很多数字卡片,每张卡片上都是数字0到9
小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从1拼到多少。
例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11
现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?
提示:建议使用计算机编程解决问题。
这题动手在草稿纸上画一画,会发现最先用完的总是1。因此,遍历数字到1用完为止
count = 0
for i in range(9999):
num = str(i)
count = count + num.count('1')
if count > 2021:
print(i-1)
elif count == 2021:
print(i)
break
结果:3181
直线
【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上2×3个整点{ ( x , y ) | 0 ≤ x < 2 , 0 ≤ y < 3 , x ∈ Z , y ∈ Z } , 即横坐标是0到1(包含0和1)之间的整数、纵坐标是0到2(包含0和2)之间的整数的点。这些点一共确定了11条不同的直线。
给定平面上20×21个整点{ ( x , y ) | 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z},即横坐标是0到19(包含0和19)之间的整数、纵坐标是0到20(包含0和20)之间的整数的点。请问这些点一共确定了多少条不同的直线。
这题要注意两点:
一是如何判断是否为同一直线,需要通过斜率和截距两个维度判断
二是如何处理斜率无穷大的直线,在代码中可以先不处理这些直线,最后输出结果时加上x坐标集合的长度即可。比如{ ( x , y ) | 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z},只有20条斜率无穷大的直线,因此最后加上20就好。
x = [i for i in range(0,20)]
y = [i for i in range(0,21)]
# 斜率: k = (y2 - y1) / (x2 - x1)
# 截距:b = - k * x1 + y1 = (x2 * y1 - x1 * y2) / (x2 - x1)
def kkk(p1,p2):
k = (p1[1]-p2[1])/(p1[0]-p2[0])
return k
# 构造点集
point = []
for i in range(len(x)):
for j in range(len(y)):
point.append([x[i],y[j]])
# 构造一个集合存放斜率和截距,集合自带查重
n = set()
for i in range(len(point)):
for j in range(len(point)):
if point[i][0] == point[j][0]:
continue
k = kkk(point[i],point[j])
b = (point[i][0]*point[j][1] - point[j][0]*point[i][1])/(point[i][0]-point[j][0])
if (k,b) not in n:
n.add((k,b))
print(len(n) + len(x))
结果:40257



