https://www.icourse163.org/learn/PKU-1001894005?tid=1450413466#/learn/content
程序设计与算法(二)算法基础
2810:完美立方
# 2810:完美立方
# http://bailian.openjudge.cn/practice/2810/
# b<=c<=d
inputNum = input()
# 2,...,int(inputNum)
for a in range(2, int(inputNum) + 1):
for b in range(2, a):
for c in range(b, a):
for d in range(c, a):
if a*a*a == b*b*b + c*c*c + d*d*d:
print("Cube = %d, Triple = (%d,%d,%d)" % (a, b, c, d))
4148:生理周期
# 4148:生理周期
# http://bailian.openjudge.cn/practice/4148
count = 1
while True:
p, e, i, d = [int(s) for s in input().split()]
if d == -1:
break
#第一次高峰出现的时间
p = p % 23
e = e % 28
i = i % 33
# print(p, e, i)
# 所求的时间<=21252
for day in range(i, d + 21252 + 1, 33): #在[i, d + 21252]区间内找最小的i + 33 *n
if day % 23 == p and day % 28 == e:
if day <= d:
day += 21252 #题目要求在给定时间d之后的某一天
print("Case %d: the next triple peak occurs in %d days." % (count, day - d))
# 从给定时间起,下一次三个高峰同一天的时间(距离给定时间的天数)。
break
count += 1
2692:假币问题
# 2692:假币问题
# http://bailian.openjudge.cn/practice/2692
def IsFake(cc,light,leftside,rightside,result):
for ii in range(0, 3):
# 如果假设假币cc是轻的
if light:
sleft = leftside[ii]
sright = rightside[ii]
# 如果假设假币cc是重的
else:
sleft = rightside[ii]
sright = leftside[ii]
if result[ii] == 'up': # 右端高
if sright.find(cc) == -1: # 如果假设假币cc不在右边,那么假设假币cc不是轻的
return False
elif result[ii] == 'even': # 平衡
if sright.find(cc)!=-1 or sleft.find(cc)!=-1:
return False
elif result[ii] == 'down': # 右端低
if sleft.find(cc) == -1: # 如果假设假币cc不在左边,那么假设假币cc不是轻的
return False
return True
leftside = ['left', 'left', 'left']
rightside = ['righ', 'righ', 'righ']
result = ['resu', 'resu', 'resu']
# 第一行有一个数字n,表示有n组测试用例
num = int(input())
# print(num)
while num > 0:
for ii in range(0, 3):
leftside[ii], rightside[ii], result[ii] = [s for s in input().split()]
for cc in [chr(i) for i in range(65,77)]:
if IsFake(cc,True,leftside,rightside,result):
print("%c is the counterfeit coin and it is light." % cc)
break
elif IsFake(cc,False,leftside,rightside,result):
print("%c is the counterfeit coin and it is heavy." % cc)
break
num -= 1
2811:熄灯问题
# 2811:熄灯问题
# http://bailian.openjudge.cn/practice/2811/
def guess():
#根据press的第一行和puzzle的第一行,确定press其他行的值
for r in range(1, num_row):
for c in range(1, num_col + 1):
# 如果puzzle[r][c]原来就是1或者被它上左右的按钮按成了1,那么要求press[r + 1][c]=1
press[r + 1][c] = (puzzle[r][c] + press[r][c] + press[r - 1][c] +
press[r][c - 1] + press[r][c + 1]) % 2
for c in range(1, num_col + 1):
# 如果最后一行的puzzle[num_row][c]上左右的按钮press未能将其熄灭,那么此次枚举失败
if (press[num_row][c - 1] + press[num_row][c] + press[num_row][c + 1] +
press[num_row - 1][c]) % 2 != puzzle[num_row][c]:
return 0 # 失败
return 1 # 成功
# 枚举第一行按下开关的所有可能性,有2^num_col个
# def enumeration():
# while guess() == 0: # 如果枚举失败,那么继续枚举
# press[1][1] += 1
# col = 1
# while (press[1][col] > 1):
# press[1][col] = 0
# # 枚举下一列
# col += 1
# press[1][col] += 1
# continue
# 枚举第一行按下开关的所有可能性,有2^num_col个
def enumeration():
state = 0
while guess() == 0: # 如果枚举失败,那么继续枚举
state_ = state
for jj in range(1, num_col + 1):
press[1][jj] = state_ % 2
state_ = state_ // 2
state += 1
continue
num_row = 5
num_col = 6
line = [[0] * (num_col + 2)] * (num_row + 1)
line[0] = [0] * (num_col + 2)
for i in range(1, num_row + 1):
# line[i]=input("请输入第"+str(i)+"行:").split(' ')
inputline = input().split(' ')
#将line中的元素转换为整型
inputline = list(map(int, inputline))
inputline.insert(0, 0)
inputline.insert(num_col + 1, 0)
line[i] = inputline
puzzle = line
press = [[0 for col in range(num_col + 2)]
for row in range(num_row + 1)] # (num_row+1)*(num_col+2) 不要写反
enumeration()
for ii in range(1, num_row + 1):
for jj in range(1, num_col + 1):
if jj == num_col:
print("%d" % press[ii][jj])
else:
print("%d " % press[ii][jj], end="")