排序
冒泡排序
宝藏排序1
#冒泡排序 #宝藏排序1 n=int(input()) a=list(map(int,input().split())) #循环n-1次,获得第i大 for i in range(1,n-1): #每一次比较a[j]和a[j+1] for j in range(0,n-i-1): if a[j]>a[j+1]: a[j],a[j+1]=a[j+1],a[j] print(' '.join(map(str,a)))
选择排序
#选择排序 n=int(input()) a=list(map(int,input().split())) for i in range(n-1): #第i次从[i,n-1]找最小值 min_value=a[i] min_idx=i for j in range(i,n): if a[j]<min_value: min_value=a[j] min_idx=j #将最小值和最前面的元素交换 a[min_idx], a[i]=a[i], a[min_idx] print(' '.join(map(str,a)))
插入排序
#插入排序 n=int(input()) a=list(map(int,input().split())) #对于第i个数字,在区间[0,i-1]中从后往前找对应插入的位置 for i in range(1,n): value=a[i] #插入元素的下标 insert_idx=0 for j in range(i-1,-1,-1): if a[j]>value: #往后挪 a[j+1]=a[j] else: inser_idx=j+1 break #插入第i个数字 a[insert_idx]=value print(' '.join(map(str,a)))
枚举
容斥定理:1~n中a的倍数有n//a个
1~n中是a或者是b的倍数有n//a + n//b - n//(a+b)
进制转换
基数:表示基本数字符号的个数
10进制:0-9,基数为10
16进制:0-9、A-F,基数为16
权:每位表示的数值
123:1表示1个100、2表示2个10、3表示3个1
权=基数^x,x表示当前为第几位(从右往左,从0计数)
任意进制转十进制
#把k进制的数字x转换成10进制 #输入:k:int x:str #输出:ans:int int_to_char='0123456789ABCDEF' char_to_int={} for idx,chr in enumerate(int_to_char): char_to_int=idx def k_to_ten(k,x): ans=0 for char in x: ans=ans*k+char_to_int[char] return ans
十进制转任意进制
除k取余法:十进制数字不断除以k求余数,然后逆序输出
89(十进制)=1011001(二进制)
int_to_char='0123456789ABCDEF' char_to_int={} for idx,chr in enumerate(int_to_char): char_to_int=idx def ten_to_k(k,x): #输入:十进制数字x:int 转成k:int进制 #输出:ans:str 转换成k进制的答案 ans="" while x!=0: ans+=int_to_char[x%k] x//=k return ans[::-1]
任意进制转换
(蓝桥)进制转换
int_to_char='0123456789ABCDEF' char_to_int={} for idx,chr in enumerate(int_to_char): char_to_int=idx def k_to_ten(k,x): ans=0 for char in x: ans=ans*k+char_to_int[char] return ans def ten_to_k(k,x): #输入:十进制数字x:int 转成k:int进制 #输出:ans:str 转换成k进制的答案 ans="" while x!=0: ans+=int_to_char[x%k] x//=k return ans[::-1] T=int(input()) for _ in range(T): n,m=map(int,input().split()) x=input() #n进制的x转为m进制 #n进制的x转为10进制的y #10进制的y转为m进制的z y=k_to_int(n,x) z=ten_to_k(m,y) print(z)
前缀和
二维前缀和
#输出一个二维list def output(a,n): for i in range(1,n+1): print(' '.join(map(str,a[i][1:]))) n,m=map(int,input().split()) #下标从1开始 a=[[0]*(m+1) for i in range(n+1)] sum=[[0]*(m+1) for i in range(n+1)] #输入一个二维数组 for i in range(1,n+1): a[i]=[0]+list(map(int,input().split())) #output(a,n) for i in range(1,n+1): for j in range(1,m+1): sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j] output(sum,n)
统计子矩阵(蓝桥)70% pypy3
差分
区间更新(蓝桥)
while True: try: n,m=map(int,input().split()) a=list(map(int,input().split())) diff=[0]*(n+1) diff[0]=a[0] for i in range(1,n): diff[i]=a[i]-a[i-1] for _ in range(m): x,y,z=map(int,input().split()) x-=1 y-=1 diff[x]+=z diff[y+1]-=z a[0]=diff[0] for i in range(1,n): a[i]=a[i-1]+diff[i] print(" ".join(map(str,a))) except: break
二维差分数组
离散化
from bisect import * def discrete(a): #1copy一份b、排序去重 b=list(set(a)) b.sort() ans=[] #对a中的每个元素x,将x转换成b中的下标 for x in a: ans.append(bisect_left(b,x))#二分查找x在b中的下标 return ans a=list(map(int,input().split())) print(discrete(a))
贪心
谈判(蓝桥)---经典贪心 石子合并问题
import heapq n=int(input()) a=list(map(int,input().split())) #堆:每次获取最小元素,添加元素 #1、把a转换成堆 heapq.heapify(a) ans=0 while len(a)>=2: #取出两个最小元素,合并即可 x=heapq.heappop(a) y=heapq.heappop(a) heapq.heappush(a,x+y) ans+=x+y print(ans)
纪念品分组---(分箱问题)蓝桥532
w=int(input()) n=int(input()) a=[] for i in range(n): a.append(int(input())) a.sort() l,r=0,n-1 ans=0 while True: if l==r: ans+=1 break if l>r: break #能否配对 if a[l]+a[r]<=w: ans+=1 l+=1 r-=1 else: #大的单独放 ans+=1 r-=1 print(ans)
翻硬币(翻硬币问题)
s=list(input()) t=list(input()) n=len(s) ans=0 #逐一对比,不同就翻 for i i