Python蓝桥31天,第三天

1. 排他平方数

题目描述

在这里插入图片描述

解析:

一开始真没读懂这个题,读了好几遍终于明白了
其实就是让你求2014年减去n年后,那一年的年份各个数字之和等于n

代码

count = []
for i in range(1900,2014):
    if 2014 - i == sum([int(m) for m in list(str(i))]):
        count.append(i)
print(min(count)) # 输出的小明的

2.纸牌三角形

题目描述

在这里插入图片描述

解析:

将所有有可能的排序方式全部找出来,9个数字,排列组合A(m=9,n=9)种组合方式,这些组合种一定有1-4个数的和== 4-7个数的和 = = 7-1个数的和(用了Python的内置函数,不过我建议还是看一看手写怎么做,毕竟内置这个内置函数很少用)
因为每种组合都有它的镜像2个和旋转3个,所以要除以6

代码

import itertools
count = 0
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in itertools.permutations(a, 9):
    w = list(i)
    if w[0] + w[1] + w[2] + w[3] == w[3] + w[4] + w[5] + w[6] == w[6] + w[7] + w[8] + w[0]:
        count+=1
print(count//6)

3.纸牌三角形

题目描述

在这里插入图片描述

解析:(动态规划版本)

  • 根据题意,知道三个要点:1. A先取;2. 只能取1/3/7/8个球;3. 最后取的人失败

  • 可以推断出

    • A为了赢,就要在A取出1/3/7/8个球后,让B只能取最后的球
    • 自己算一下,在1-8的范围内,谁面临2/4/6/8个球的局面,谁赢,谁面临1/3/5/7的局面谁死
      • 2:A取1剩1
      • 4:A取3剩1
      • 5:A取1B取1循环最后,A死;A取1B取1A取3,A死;A取1B取3A取1,A死;A取3B取1A取1,A死;【无论如何谁首先遇到5谁就死】
      • 6:A取1剩5
      • 7:A取1B面临6,A死;A取3B面临4,A死,A取7,直接死【无论谁首先遇到7谁就死】
      • 8:A取1剩7
    • 可以看出这是一个动态规划,建立一个一维数组dp[ ],index表示球的数量,value用1和0分别表示赢和输;
  • 012345678910
    001010101
  • 根据题意:
    dp[i-1/3/7/8]==0 ,dp[i] = 1
    PS:说明:谁第一个面临i个球,都会有1/3/7/8四种取球方式,如果在做出其中一种取球动作时候,遇到了必死的局面,也就是i-1/3/7/8后等于必死数目的时候,比如取完后只剩下1/3/5/7个球,说明i这个数真的可以处,能弄死下一个人它真让你弄死,所以赋值
    这里是相似的写法,同时感谢大佬指点,如果我的不明白可以看这个,至少我是看明白了!

代码

dp = [0 for i in range(10001)]
dp[2] = dp[4] = dp[6] = dp[8] = 1
for i in range(9,len(dp)):
    if dp[i - 1] == 0:
        dp[i] = 1
    elif dp [i - 3] == 0:
        dp[i] = 1
    elif dp[i-7] == 0:
        dp[i] = 1
    elif dp[i-8] == 0:
        dp[i] = 1
n = int(input())
for i in range(n):
    print(dp[int(input())])
代码(递归版本——超时)
# def boolen_(n):
#     if n == 1: return False
#     if n > 8 and boolen_(n-8) == False :return True
#     if n > 7 and boolen_(n-7) == False :return True
#     if n > 3 and boolen_(n-3) == False :return True
#     if n > 1 and boolen_(n-1) == False :return True
#     return False
#
# n = int(input())
# for i in range(n):
#      m = int(input())
#      if boolen_(m):
#          print(1)
#      else:
#          print(0)
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值