洛谷 题单 官方精选 暴力枚举 Python实现

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

n,m=map(int,input().split())
if n>m:
    n,m=m,n
a=int((n*(n+1)/2)*(m*(m+1)/2))
x,y=0,0
for i in range(1,n+1):
    x+=(n-i+1)*(m-i+1)
print(x,a-x)

注释:就是排列组合问题

P2089 烤鸡

n=int(input())
if n>30 or n<10:
    print(0)
else:
    ls=[]
    for a in range(1,4):
        for b in range(1,4):
            for c in range(1,4):
                for d in range(1,4):
                    for e in range(1,4):
                        for f in range(1,4):
                            for g in range(1,4):
                                for h in range(1,4):
                                    for i in range(1,4):
                                        for j in range(1,4):
                                            if a+b+c+d+e+f+g+h+i+j==n:
                                                ls.append([str(a),str(b),str(c),str(d),str(e),str(f),str(g),str(h),str(i),str(j)])
    print(len(ls))
    for x in ls:
        print(" ".join(x))

注释:真就暴力枚举就行。

P1618 三连击(升级版)

def hanshu(z,A,B,C,ls):
    a,b=z*B,z*C
    if a//A*A!=a or b//A*A!=b:
        return False
    a//=A
    b//=A
    di=[]
    for o in (str(z),str(a),str(b)):
        for O in o:
            di.append(int(O))
    di.sort()
    if di==ls:
        return True
    else:
        return False
A,B,C=map(int,input().split())
ls=[o for o in range(1,10)]
di=[]
for i in ls:
    for j in ls:
        if j==i:
            continue
        for k in ls:
            if k==i or k==j:
                continue
            z=int(str(i)+str(j)+str(k))
            if hanshu(z,A,B,C,ls)==True:
                di.append([str(z),str(z*B//A),str(z*C//A)])
if di==[]:
    print("No!!!")
else:
    for o in di:
        print(" ".join(o))

注释:一样直接暴力枚举就好。因为保证A<B<C了,所以直接三个循环就好。

P1036 [NOIP2002 普及组] 选数

from math import sqrt
def hanshu1(n):
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            return False
    else:
        return True
def hanshu2(n):
    m,ls=3,[2]
    while m<=n:
        for i in ls:
            if m%i==0:
                m+=1
                break
        else:
            if hanshu1(m)==True:
                ls.append(m)
            m+=1
    return ls
def hanshu(ls,m,x):
    global di
    if m==0:
        di.append(x)
    else:
        m-=1
        n=len(ls)
        for i in range(n):
            x+=ls[i]
            hanshu(ls[i+1:],m,x)
            x-=ls[i]
n,m=map(int,input().split())
ls=[int(i) for i in input().split()]
di=[]
x=hanshu(ls,m,0)
x=max(di)
sl=hanshu2(x)
count=0
for i in di:
    if i in sl:
        count+=1
print(count)

注释:递归遍历列表把每个值存储在列表中。因为害怕内存超限。使用了较为低端的欧拉筛法。当然时间会慢一点,但是够了。如果想要学习欧拉筛法可以看这

P1157 组合的输出

n,m=map(int,input().split())
di=[]
ls=[i for i in range(1,n+1)]
def hanshu(ls,m,x):
    global di
    if m==0:
        di.append(x.split())
    else:
        m-=1
        y=len(ls)
        for i in range(y):
            z=x
            x+=str(ls[i])+" "
            hanshu(ls[i+1:],m,x)
            x=z
hanshu(ls,m,"")
for i in di:
    x=""
    for k in i:
        if len(k)==3:
            y=""
            y+=k
            x+=y
        elif len(k)==2:
            y=" "
            y+=k
            x+=y
        else:
            y="  "
            y+=k
            x+=y
    print(x)

注释:代码看起来挺长的,但是一半都是在输出的路上。挺简单的没啥要说。哎嘿,可以用format格式输出。你要这样输出也莫得问题哦。

for i in di:
    for j in range(m):
        print("{:>3s}".format(i[j]),end="")
    print("")

P1706 全排列问题

代码一:

from itertools import permutations
n = int(input())
a = [str(i) for i in range(1,n+1)]
s = ""
s = s.join(a)
for i in permutations(s,n):
    x=""
    for j in i:
        y="    "
        y+=str(j)
        x+=y
    print(x)

注释:因为不超过9,反正这么做就对了。

代码二:

def hanshu(列表,x,y):
    global di
    if x==y:
        z=""
        for j in 列表:
            y="    "
            y+=j
            z+=y
        di.append(z)
    else:
        for i in range(x,y):
            列表[x],列表[i]=列表[i],列表[x]
            hanshu(列表,x+1,y)
            列表[x],列表[i]=列表[i],列表[x]
n=int(input())
ls=[str(i) for i in range(1,n+1)]
di=[]
hanshu(ls,0,n)
di.sort()
for i in di:
    print(i)

注释:一开始我还在想怎么字典序输出,结果sort()一下就好了。注意函数执行完成后不是字典序。一开始我还以为程序错误。这道题就是去递归交换交换列表元素顺序,不懂看这

P1088 [NOIP2004 普及组] 火星人

def hanshu():
    global ls
    for i in range(n-2,-1,-1):
        if ls[i]<ls[i+1]:
            break
    for j in range(n-1,i,-1):
        if ls[j]>ls[i]:
            break
    ls[i],ls[j]=ls[j],ls[i]
    ls1=ls[:i+1]
    ls2=ls[i+1:]
    ls2.sort()
    ls=ls1+ls2
n=int(input().strip())
m=int(input().strip())
ls=[int(i) for i in input().strip().split()]
for i in range(m):
    hanshu()
for i in ls:
    print(i,end=" ")

注释:这是洛谷第二个题解的翻译。

P3392 涂国旗

def hanshu(ls,n,m):
    global sl
    for i in range(n-m+1):
        cnt=0
        for j in range(n):
            if j<i:
                for k in ls[j]:
                    if k!="W":
                        cnt+=1
            elif j>i+m-1:
                for k in ls[j]:
                    if k!="R":
                        cnt+=1
            else:
                for k in ls[j]:
                    if k!="B":
                        cnt+=1
        sl.append(cnt)
N,M=map(int,input().split())
ls=[]
for i in range(N):
    sl=[i for i in input().rstrip()]
    ls.append(sl)
cnt=0
for i in ls[0]:
    if i!="W":
        cnt+=1
ls.pop(0)
for i in ls[-1]:
    if i!="R":
        cnt+=1
ls.pop()
sl=[]
for i in range(1,N-1):
    hanshu(ls,N-2,i)
print(min(sl)+cnt)

注释:更简单了,递归都不需要,直接就是硬想。不要老是天天递归,要出人命。

P3654 First Step (ファーストステップ)

def hanshu(ls,K):
    x=0
    for i in ls:
        y=0
        for j in i:
            if j==".":
                y+=1
            else:
                if y>=K:
                    x+=y-K+1
                    y=0
                else:
                    y=0
        if y>=K:
            x+=y-K+1
    return x
R,C,K=map(int,input().split())
ls=[]
for i in range(R):
    sl=[i for i in input().rstrip()]
    ls.append(sl)
a=hanshu(ls,K)
m=[]
for i in range(C):
    n=[]
    for j in range(R):
        n.append(ls[j][i])
    m.append(n)
ls=m
b=hanshu(ls,K)
if K==1:
    print((a+b)//2)
else:
    print(a+b)

注释:一样就是硬想,没啥算法。

P1217 [USACO1.5]回文质数 Prime Palindromes

代码一:

from math import sqrt
def hanshu(x,y,z):
    global ls,n,m
    if y==x:
        for i in ["1","3","5","7","9"]:
            z+=i
            hanshu(x,y-1,z)
            z=z[:-1]
    elif y==0:
        j=int(z[1:][::-1]+z)
        if j>=n and j<=m and zhishuhanshu(j)==True:
            ls.append(j)
    else:
        for i in ["0","1","2","3","4","5","6","7","8","9"]:
            z=i+z
            hanshu(x,y-1,z)
            z=z[1:]
def huiwenhanshu1(x):
    x=x//2+1
    hanshu(x,x,"")
def zhishuhanshu(n):
    m=int(sqrt(n))+1
    for i in range(2,m):
        if n%i==0:
            return False
    return True
n,m=map(int,input().split())
x,y,ls=len(str(n)),len(str(m)),[]
for i in range(x,y+1):
    if i%2==1:
        huiwenhanshu1(i)
    else:
        if i==2:
            if 11>=n and 11<=m:
                ls.append(11)
ls.sort()
for i in ls:
    print(i)

注释:这个完全AC。先生成回文数列表。然后暴力判断质数。

代码二:

from math import sqrt
def hanshu(a,b):
    ls=[True]*(b+1)
    c=int(sqrt(b))+1
    d=2
    while d<c:
        if ls[d]==True:
            for i in range(d+d,b+1,d):
                ls[i]=False
        d+=1
    for i in range(a,b+1):
        j=str(i)
        if j==j[::-1]:
            if ls[i]==True:
                print(j)
a,b=map(int,input().split())
hanshu(a,b)

注释:欧拉筛法走到筛法尽头,还是不能过哦,基数太大。

P1149 [NOIP2008 提高组] 火柴棒等式

n=int(input())
n-=4
di={0:6,1:2,2:5,3:5,4:4,5:5,6:6,7:3,8:7,9:6}
for i in range(10,10001):
    j=str(i)
    count=0
    for k in j:
        count+=di[int(k)]
    di[i]=count
x=0
for i in range(0,1001):
    for j in range(0,1001):
        z=di[i]+di[j]
        if z>=n:
            continue
        else:
            k=i+j
            if z+di[k]==n:
                x+=1
print(x)

注释:直接造出一个字典去做。

P3799 妖梦拼木棒

n=int(input().strip())
ls,di=[],{}
for i in range(n):
    m=int(input().strip())
    if m not in di:
        di[m]=1
        ls.append(m)
    else:
        di[m]+=1
ls.sort()
m=len(ls)
cnt=0
for i in range(m):
    if di[ls[i]]>=2:
        a=ls[i]
        A=di[a]
        sl=[]
        for j in range(i):
            b=ls[j]
            B=di[b]
            c=a-b
            if c==b:
                cnt+=A*(A-1)*B*(B-1)//4
            else:
                if c in ls and c not in sl:
                    sl.append(b)
                    cnt+=A*(A-1)*B*di[c]//2
print(cnt%(pow(10,9)+7))

注释:明确告诉你这道题Py过不了。这个算法全LTE,但是的确是最优的算法。使用PyPy3确实快一点。但是不知道为什么报错。但实际答案是对滴。

P2392 kkksc03考前临时抱佛脚

def hanshu(ls,a,b,c,d):
    global y
    if b==0:
        if c<=d:
            e=d-c
            if e<y:
                y=e
    else:
        for i in range(a):
            c+=ls[i]
            if c>d:
                return None
            hanshu(ls[i+1:],a-i-1,b-1,c,d)
            c-=ls[i]
s1,s2,s3,s4=map(int,input().strip().split())
ls1=[int(i) for i in input().strip().split()]
ls2=[int(i) for i in input().strip().split()]
ls3=[int(i) for i in input().strip().split()]
ls4=[int(i) for i in input().strip().split()]
ls=[[ls1,s1],[ls2,s2],[ls3,s3],[ls4,s4]]
x=0
for i in ls:
    i[0].sort()
    if i[1]==1:
        x+=i[0][0]
    elif i[1]==2:
        x+=max(i[0])
    else:
        y=float('inf')
        z=sum(i[0])/2
        for j in range(1,i[1]):
            hanshu(i[0],i[1],j,0,z)
        x+=z+y
print(int(x))

注释:这道题使用PyPy3提交。Python3过不了,至少搜索算法过不了吧!我感觉我已经剪枝剪得不能再剪了。PyPy3之前能过,现在第一个数据过不了。它们修改了数据吧。

P2036 [COCI2008-2009#2] PERKET

def hanshu(i,a,b):
    global x
    if i>n:        
        if a==1 and b==0:
            return None
        x=min(abs(a-b),x)
        return None
    hanshu(i+1,a*ls[i-1][0],b+ls[i-1][1])
    hanshu(i+1,a,b)
x=float("inf")       
n=int(input())
ls=[]
for i in range(n):
    a,b=map(int,input().split())
    ls.append([a,b])
hanshu(1,1,0)
print(x)

注释:广度优先搜索算法,没啥要所的吧。一定要加return None。不然会RE。

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值