Tabla de contenido
1. Clasificación bidireccional
Problema de comer dulces de Xiaolan
Problema de evaluación de secuencias
1. Puntos de conocimiento
1. Ordenar
sorted () se puede ordenar parcialmente mediante cortes, y la función sort () se usa de manera inteligente en la lista
sorted implementa reglas de clasificación personalizadas a través de claves personalizadas y necesita importar funciones
-1 significa dejar sin cambios, 1 significa orden de intercambio.
una pregunta de muestra
import functools
def cmp(n1,n2): # 1表示交换,-1表示不变
if n1[1]!=n2[1]: # 降序
return -1 if n1[1]>n2[1] else 1
elif n1[2] != n2[2]: # 降序
return -1 if n1[2]>n2[2] else 1
else: # 升序
return 1 if n1[0]>n2[0] else -1
n = int(input())
scores =[]
for i in range(n):
score = list(map(int,input().split()))
score.append([i+1,sum(score)]+score) # [学号,总分,语数外]
scores=sorted(iterable,key=functools.cmp_to_key(cmp))
for i in range(5):
print(scores[i][0],scores[i][1])
2. Combinación
Combinación: combinación en itertools
Permutación: perminación en itertools
principio del casillero
Triángulo Yang Hui
2. Cepillo de preguntas
1. Clasificación bidireccional
n,m=map(int,input().split())
a = [i for i in range(1,n+1)]
for i in range(m):# m次操作
p,q=map(int,input().split())
if p==0:
a=sorted(a[0:q:],reverse=True)+a[q::1] # 切片拼接 #下标从0开始,要减1
elif p==1:
a=a[:q-1:1]+sorted(a[q-1::1])
print(*a)
licitación
n, m = map(int, input().split())
list1 = [i for i in range(1, n + 1)]
for j in range(m):
p, q = map(int, input().split())
if p == 0:
list2 = list1[0:q]
list2.sort()
list1[0:q] = list2[::-1]
else:
list2 = list1[q - 1::]
list2.sort()
list1[q - 1::] = list2
for i in list1:
print(i, end=' ')
Se agotó el tiempo de espera, más del 60 % de los datos
orden númerico
import os
import sys
# 请在此输入您的代码
n = int(input())
m = int(input())
x= [str(i) for i in range(1,n+1)]
import functools
def cmp(a,b): # -1不变 1 变
x1=sum(list(map(int,list(a)))) # 字符串拆分转列表求和
x2=sum(list(map(int,list(b))))
if x1!=x2:
return -1 if x1<x2 else 1 # 升序
else:
return -1 if a>b else 1 # 降序
x.sort(key=functools.cmp_to_key(cmp))
print(x[m-1])
licitación
n = int(input())
m = int(input())
a = [i for i in range(1, n + 1)]
b = [0] * (n + 1)
for i in range(1, n + 1):
#求i的数位之和
num = i
while num != 0:
b[i] += num % 10
num //= 10
a.sort(key=lambda x: (b[x], x))
print(a[m - 1])
rueda suiza
Para aquellos que lo han perdido todo en esta ronda, la clasificación relativa entre ellos no cambiará, y para aquellos que lo han ganado todo en esta ronda, tiene la misma naturaleza.
Entonces, cada vez para el final de cada ronda, la secuencia se puede hacer ordenada con solo O (n) complejidad de tiempo.
# 对于在该轮中全部输的人,他们之间的相对排名不会发生变化,对于在该轮中全部赢的人,也有同样的性质。
N, R, Q = map(int, input().split()) # 选手 ,比赛 ,名次
s = map(int, input().split()) # 初始分数
w = list(map(int, input().split())) # 实力值
i = range(2 * N)
data = sorted(map(lambda s, i: [s, i], s, i), key=lambda x: (-x[0], x[1])) # 构建[分数,索引] ,按分数从大到小排序
def merge(win, lose):
res = []
while win and lose:
if (win[0][0] == lose[0][0] and win[0][1] < lose[0][1]) or (
win[0][0] > lose[0][0]
): # 赢的总分高,或者总分一样但是索引更小
res.append(win.pop(0))
else:
res.append(lose.pop(0))
return res + win + lose
for _ in range(R):
win, lose = [], []
for i in range(0, 2 * N, 2): # 寻找胜利者失败者
if w[data[i][1]] > w[data[i + 1][1]]:
data[i][0] += 1
win.append(data[i])
lose.append(data[i + 1])
else:
data[i + 1][0] += 1
win.append(data[i + 1])
lose.append(data[i])
data = merge(win, lose)
print(data[Q - 1][1] + 1)
Problema de comer dulces de Xiaolan
n = int(input())
a=list(map(int,input().split()))
if sum(a)-max(a) < max(a-1):
# 剩下的糖果数量小于隔板弄成的空间
# |1|2|3|4|5| 6板最少5空间
print('No')
else:
print("Yes")
Problema de evaluación de secuencias
Mientras los últimos 4 dígitos, recuerde tomar el resto, de lo contrario, el desbordamiento de la memoria es insuficiente, incluso si no hay desbordamiento, el cálculo será muy lento.
# maxn = 20190325
# a = [0] * maxn
# a[1], a[2], a[3] = 1, 1, 1
# for i in range(4, maxn):
# a[i] = (a[i-1] + a[i-2] + a[i-3]) % 10000
# print(a[20190324])
print(4659)
Triángulo Yang Hui
Método de escritura fraudulento (primero imprimir y unir en una cola, luego encontrar el valor a través del índice de la lista) 20%
import os
import sys
# 骗分写法
n=int(input())
a=[[1],[1,1]]
for i in range(1,50): # 50-1+2行
b=[]
temp=0
for j in range(i): # 根据上一行i计算
temp=a[i][j]+a[i][j+1]
b.append(temp)
a.append([1]+b+[1])
# print(a)
b=[]
for i in range(51): #进行队列拼接
b=b+a[i]
print(b.index(n)+1) # 直接通过队列值找索引
Problema de combinación
Escritura violenta, más del 20%
import os
import sys
# 请在此输入您的代码
def f(i,j): # 5 3 5*4*3/3*2*1
a,b=1,1
for z in range(i,i-j,-1): # 5,2
a*=z
for z in range(1,j+1):
b*=z
return a//b
t,k = map(int,input().split())
ans=0
for _ in range(t):
n,m=map(int,input().split())
for i in range(1,n+1):
for j in range(0,min(i,m)+1):
if f(i,j)%k==0:
print(i,j)
ans+=1
print(ans%(10**9+7))