参考链接:
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
思路:无论筛子的1在什么位置,通过向左转向右转向前转向后转和上下翻(分为顺时针逆时针)转都可以将筛子改变为1面向上的情况,将筛子置为1向上的情况之后,继续考虑筛子原地自转的三种情形,从而纠正筛子的位置,将所有筛子纠正完成后,判断各类筛子的个数。
from collections import defaultdict
if __name__ == '__main__':
m = int(input())
counter = defaultdict(int)
a, b, c, d, e, f = 0, 1, 2, 3, 4, 5
for _ in range(m):
nums = list(map(int, input().split()))
for idx, val in enumerate(nums):
#先把1转到最上,如果相同类型的话,2一定为最下
if val == 1:
if idx == a:
break
elif idx == b:
nums[a], nums[b] = nums[b], nums[a]
nums[e], nums[f] = nums[f], nums[e]
elif idx == c:
nums[a], nums[d], nums[b], nums[c] = nums[c], nums[a], nums[d], nums[b]
elif idx == d:
nums[a], nums[c], nums[b], nums[d] = nums[d], nums[a], nums[c], nums[b]
elif idx == e:
nums[a], nums[f], nums[b], nums[e] = nums[e], nums[a], nums[f], nums[b]
elif idx == f:
nums[a], nums[e], nums[b], nums[f] = nums[f], nums[a], nums[e], nums[b]
break
num2f = nums[a] + 1 #此时num2f为2
if num2f == nums[b]:#判断2是否为最下
num2f += 1
#通过判断3所在位置,纠正筛子的自转。将筛子六个面数值纠正为[1,2,3,4,5,6]
for idx, val in enumerate(nums):
if val == num2f:
if idx == c:
break
elif idx==d:
nums[c],nums[d]=nums[d],nums[c]
nums[e],nums[f]=nums[f],nums[e]
elif idx==e:
nums[c],nums[d]=nums[e],nums[f]
nums[e],nums[f]=nums[c],nums[d]
elif idx ==f:
nums[c], nums[d], nums[e], nums[f] = nums[f], nums[e], nums[c], nums[d]
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
请各位大佬不吝赐教