参考链接:
https://www.nowcoder.com/discuss/465198?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
https://august-us.blog.csdn.net/article/details/107751194
第一题:飞行棋
输入:
两行数字,其中第一行是距离终点的步数和最后还有几次掷色子机会(N);
第二行是n步棋的每一步是多少数值。(数值是掷色子决定的,所以在1-6之间)。
输出:
一行数字,第一个数字为最终棋子到终点的距离,第二个数字为回退的次数。
如果在掷N次色子之前已经到达终点,则输出“paradox"
例:
输入:10 2
3 6
输出:
1 0
import sys
for i in range(0,1):
line=sys.stdin.readline().strip()
values=list(map(int,line.split()))
for i in range(1):
line=sys.stdin.readline().strip()
values1=list(map(int,line.split()))
k=values[0]
n=values[1]
res = 0
for id,i in enumerate(values1):
if i==k and id!=n-1:
print('paradox')
exit(0)
elif i<=k:
k-=i
else:
k=i-k
res +=1
print(k, res)
第二题:掷色子
备注:筛子的6个面排列顺序是(上下左右前后)
输入:
第一行为n代表多少枚筛子,第二行为第一个筛子的6个面的数值,第三行为第二个筛子的6个面,一直到第n+1行为第n个筛子的。
输出:
两行,第一行为多少种不同类别的筛子,第二行为每一种类别对应的个数,按大到小排列。
例:
输入:
2
1 2 3 4 5 6
1 2 6 5 3 4
输出
1
2
from collections import defaultdict
if __name__ == '__main__':
m = int(input())
counter = defaultdict(int)
u, d, l, r, f, b = 0, 1, 2, 3, 4, 5
for _ in range(m):
nums = list(map(int, input().split()))
for idx, val in enumerate(nums):
if val == 1:
if idx == u:
break
elif idx == d:
nums[u], nums[d] = nums[d], nums[u]
nums[f], nums[b] = nums[b], nums[f]
elif idx == l:
nums[u], nums[r], nums[d], nums[l] = nums[l], nums[u], nums[r], nums[d]
elif idx == r:
nums[u], nums[l], nums[d], nums[r] = nums[r], nums[u], nums[l], nums[d]
elif idx == f:
nums[u], nums[b], nums[d], nums[f] = nums[f], nums[u], nums[b], nums[d]
elif idx == b:
nums[u], nums[f], nums[d], nums[b] = nums[b], nums[u], nums[f], nums[d]
break
num2f = nums[u] + 1
if num2f == nums[d]:
num2f += 1
for idx, val in enumerate(nums):
if val == num2f:
if idx == f:
break
elif idx == b:
nums[f], nums[b] = nums[b], nums[f]
nums[l], nums[r] = nums[r], nums[l]
elif idx == l:
nums[f], nums[r], nums[b], nums[l] = nums[l], nums[f], nums[r], nums[b]
elif idx == r:
nums[f], nums[l], nums[b], nums[r] = nums[r], nums[f], nums[l], nums[b]
counter[tuple(nums)] += 1
ret = [v for k, v in counter.items()]
ret.sort(reverse=True)
print(len(ret))
for v in ret:
print(v, end= ' ')
第三题:多多吃饭
备注:多多不吃早饭,吃午饭晚饭(可以只吃午饭或晚饭或者都不吃饿死)
输入:第一行三个数表示中餐总数N、晚餐总数M、多多满足的最小美味值T。
第二行到第N+1行为中餐的热量和美味值
第N+2行到N+M+1行代表晚餐的热量和美味值
输出:
一个整数,表示在T满足的条件下,最少的摄入热量,如果任何组合都无法达到T,输出-1
例:
输入:
2 2 5
1 2
1 3
2 2
3 3
输出:
3
(选中饭第二种和晚饭第一种)
from collections import defaultdict
if __name__ == '__main__':
n, m, t = map(int, input().split())
lunch = []
dinner = []
for _ in range(n):
# 热量 美味值
lunch.append(list(map(int, input().split())))
for _ in range(m):
dinner.append(list(map(int, input().split())))
if t == 0:
print(0)
else:
lunch.sort(key=lambda x: x[1])
dinner.sort(key=lambda x: x[1])
ll = []
dd = []
for idx, val in enumerate(lunch):
while ll and val[0] <= ll[-1][0]:
ll.pop()
if ll and val[1] == ll[-1][1]:
continue
ll.append(val)
for idx, val in enumerate(dinner):
while dd and val[0] <= dd[-1][0]:
dd.pop()
if dd and val[1] == dd[-1][1]:
continue
dd.append(val)
ret = float('inf')
for val in ll:
if val[1] >= t:
ret = min(ret, val[0])
break
for val in dd:
if val[1] >= t:
ret = min(ret, val[0])
for idx, val in enumerate(ll):
if val[1] >= t:
break
for idx, d in enumerate(dd):
if d[1] + val[1] >= t:
ret = min(ret, d[0] + val[0])
break
if ret == float('inf'):
print(-1)
else:
print(ret)
第四题:多多种菜
多多有个66大小的地,有的地方有建筑,有的地方没有,他想在每块没有建筑的土地上播撒爱的种子,种子一共六种(分别为1 2 3 4 5 6 名字忘了凑合看),满足每块地上的农作物和前后左右相邻的都不一样。
输入:
一共六行,#表示无建筑,表示有建筑。
输出:
最终方案的结果
实例:
"#*****
中间四行都有建筑
*****#
输出:
36
请各位大佬不吝赐教