lqlqlq

排序

冒泡排序

宝藏排序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
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值