1. 排他平方数

题目描述

python前n项平方和只输出最后一项 python前n个数的平方和_算法

解析:

一开始真没读懂这个题,读了好几遍终于明白了
其实就是让你求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.纸牌三角形

题目描述

python前n项平方和只输出最后一项 python前n个数的平方和_内置函数_02

解析:

将所有有可能的排序方式全部找出来,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.纸牌三角形

题目描述

python前n项平方和只输出最后一项 python前n个数的平方和_内置函数_03

解析:(动态规划版本)

  • 根据题意,知道三个要点: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分别表示赢和输;

0

1

2

3

4

5

6

7

8

9

10

0

0

1

0

1

0

1

0

1



  • 根据题意:
    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)