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分别表示赢和输;
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)