洛谷 官方题库 python 第三天

算法1-3 暴力枚举

知识点:排列和组合

排列:iteriools.permutations(iterable,r=None)

它会生成可迭代对象中所有可能的排列组合。如果指定了可选参数 r,则会生成长度为 r 的排列组合;否则,会生成与输入可迭代对象相同长度的排列组合。

from  itertools import *
s=['a','b','c']
a=permutations(s, 2)
for i in a:
    print(i,end=" ")
####out:('a', 'b') ('a', 'c') ('b', 'a') ('b', 'c') ('c', 'a') ('c', 'b') 

from  itertools import *
s=['a','b','c']
a=permutations(s, 2)
for i in a:
    j=i[0]+i[1]
    print(j,end=" ")
#out:ab ac ba bc ca cb 

组合

itertools.combinations

from  itertools import *
s=['a','b','c']
a=combinations(s, 2)
for i in a:
    j="".join(i)
    print(j,end=" ")
#out:ab ac bc 
1 .手写排列代码(暴力法)
n 个数中 m 个,n!/(n-m)!
种排列。例如从 {1, 2, 3, 4} 中选 3 个数的排列有 24 种。

最简单、直接、无技巧的手写排列代码(以 Python 代码为例)如下

s=[1,2,3,4]
for i in range(4):
    for j in range(4):
        if i!=j:
            for k in range(4):
                if k!=i and k!=j:
                    print("%d%d%d"%(s[i],s[j],s[k]),end=" ")
2 .手写组合代码(暴力法)
有时需要输出组合,从 n 个数中选 m 个,有n!/m!(n-m)!种组合。例如从{1, 2, 3, 4} 中选 3
个数的组合有 4 种。排列中的数需要分先后,组合中的数不分先后。
只需要把上面求排列的代码中的 if 语句去掉,然后按从小到大的顺序排列,即可得到组合。
s=[1,2,3,4]
for i in range(4):
    for j in range(i+1,4):
            for k in range(j+1,4):
                    print("%d%d%d"%(s[i],s[j],s[k]),end=" ")

P8599 [蓝桥杯 2013 省 B] 带分数

from itertools import *
n = int(input())
bit = len(str(n)) # n 的位数
cnt = 0
for num in permutations("123456789"):
     a, b, c = 0, 0, 0
     for al in range(bit): # al 是 a 的位数,a 肯定比 n 短
        a = int("".join(num[:al+1])) #一个 a
        bLast = (n - a) * int(num[-1]) % 10 #b 的尾数,(n-a)c%10
        if bLast == 0: continue #b 的尾数不可能等于 0,因为只用得到 1~9
        bl = num.index(str(bLast)) #根据 b 的尾数确定 b 的长度
        if bl <= al or bl >= 8: continue
        b = int("".join(num[al+1:bl+1]))
        c = int("".join(num[bl+1:]))
        if b % c == 0 and n == a + b // c: cnt += 1
print(cnt)

P2089 烤鸡

写十个for循环暴力

" ".join(x) 是 Python 中的一种字符串操作,用于将列表 x 中的元素以空格为分隔符连接成一个字符串。具体来说,它会在每个相邻的元素之间插入一个空格,并返回一个新的字符串。

P2241 统计方形(数据加强版)

‘’’
正方形个数:
边长为1: nm
边长为2:(n-1)
(m-1)
边长为3:(n-2)*(m-2)

矩形个数:正方形个数+长方形个数
(1+2+…n)*(1+2+…m)

长方形个数 = 矩形个数 - 正方形个数 ‘’’

感觉在考数学

n,m=map(int,input().split(" "))
zhen,jv,chang=0,0,0
jv=(n*(n+1)/2)*(m*(m+1)/2)
a=min(n,m)
for i in range(1,a+1):
    zhen += (n - i + 1) * (m - i + 1)
chang=int(jv-zhen)
print(zhen,chang)

 P1618 三连击(升级版)

from  itertools import *
A,B,C=map(int,input().split())
for cnm in permutations('123456789'):
    a=int(''.join(cnm[:3]))
    b=int(''.join(cnm[3:6]))
    c=int(''.join(cnm[6:]))
    if  a/A==b/B and b/B==c/C:
        print(a,b,c)
    else:
        print("No!!!")
        break
###需要将比较条件改为绝对误差小于某个很小的数值,因为浮点数计算可能会存在误差。
from  itertools import *
A,B,C=map(int,input().split())
t=0
for cnm in permutations('123456789'):
    a=int(''.join(cnm[:3]))
    b=int(''.join(cnm[3:6]))
    c=int(''.join(cnm[6:]))
    if  a/A==b/B and b/B==c/C:
        t+=1
        print(a,b,c)
if t==0:
    print("No!!!")

第一个问题在于只要有一个不满足就会输出No,然后结束运行

P1036 [NOIP2002 普及组] 选数

a=[1,2,3,4]如何实现b等于a中所有相加

怎么忘了sum函数了

from itertools import *

n, k = map(int, input().split(" "))
li = []

for i in range(n):
    li += map(int, input().split())
p = 0
for num in combinations(li, k):
    kk=sum(num)
    p+=1
    for i in range(2,kk):
        if kk%i==0:
            p-=1
            break
print(p)

结果RE,不知道为什么

P1157 组合的输出

for num in combinations(a, r):
    for i in range(r):
        print(num[i], end=" ")
    print()  # 在每个组合输出完后换行
from itertools import combinations

n, r = map(int, input().split())
a = [i for i in range(1, n + 1)]

for num in combinations(a, r):
    for i in range(r):
        print("{:3}".format(num[i]), end=" ")
    print()

解释print("{:3}".format(num[i]), end=" ")

  1. {} 是一个格式化字符串的占位符,{:3} 表示将要被填充的内容占据 3 个字符的宽度,不足部分用空格填充。

  2. format(num[i]) 是指定了要填充到占位符中的内容,即列表中的第 i 个元素。

  3. end=" " 指定了在 print() 函数输出内容后的结尾符号。在这里,将结尾符号设置为空格,这样输出的内容不会换行,而是继续在同一行输出。

举个例子,假设 num[i] 的值为 5,那么 "{:3}".format(num[i]) 的结果就是 " 5",因为数字 5 会被填充到占据 3 个字符的宽度中,并且在左侧补充空格。

PS:开始没过的原因print("{:3}".format(num[i]), end="  ")

不应该有空格

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值