2个小时,30道单选,2道编程
1. 道具的魅力值 (AC)
给定一些道具及其价格和魅力值,在总价格不超过某个上限的情况下使得购买的道具的魅力值最大。
多重背包问题,逆向枚举。
import sys
while True:
ans = []
line = sys.stdin.readline().strip()
if '' == line:
break
nums = []
price = []
value = []
n, p = list(map(int, line.split()))
for i in range(n):
nu, pr, v = list(map(int, sys.stdin.readline().strip().split()))
nums.append(nu)
price.append(pr)
value.append(v)
dp = [0] * (p+1)
for i, pr in enumerate(price):
for w in range(p, pr-1, -1):
for k in range(min(nums[i], w//pr)+1):
dp[w] = max(dp[w], dp[w-k*pr]+k*value[i])
print(dp[p])
2. 王子和公主 (AC)
给定一个n行m列的二维矩阵作为地图,’.’ 表示可以通行,‘#’表示不能通行,‘S’为起点,‘E’为终点,从起点开始,每次只能向上或向左或向下或向右移动一个,如果下一个位置为‘#’则不能移动到该位置,不允许走出地图,为能否到大终点。
dfs
import sys
move = [(0, 1), (1, 0), (0, -1), (-1, 0)]
def canGet(start_i, start_j):
visit[start_i][start_j] = True
if myMap[start_i][start_j] == 'E':
return True
for mo in move:
next_i = start_i + mo[0]
next_j = start_j + mo[1]
if 0<=next_i<n and 0<=next_j<m and myMap[next_i][next_j] != '#' and \
not visit[next_i][next_j]:
if canGet(next_i, next_j):
return True
return False
while True:
ans = []
line = sys.stdin.readline().strip()
if '' == line:
break
T = int(line)
for _ in range(T):
n, m = list(map(int, sys.stdin.readline().strip().split()))
visit = [[False] * m for _ in range(n)]
start_i = 0
start_j = 0
myMap = []
for i in range(n):
myMap.append([])
line = sys.stdin.readline().strip()
for j, c in enumerate(line):
if 'S' == c:
start_i = i
start_j = j
myMap[i].append(c)
print('Yes' if canGet(start_i, start_j) else 'No')