Kick Start 2018 - Round E
1. Yogurt
Q:给定N份酸奶,每份都有一个截止日期A[i],过期的酸奶 不能喝。每天最多只能喝K个。问什么策略可以喝到最多份酸奶。
A:
- 想法:先sort截止日期,然后往后遍历。走一个判断一个。复杂度是O(nlogn)
- 改进:创建一个数组,数组内是当天过期的酸奶量,第一天过期放第一天,第二天过期放第二天,>N天过期的放最后一天(桶排序)。从后往前遍历,后面的多的酸奶可以在最后一天喝完后放到前一天。复杂度是O(n)
2. Milk Tea
Q:给定N个二进制数,二进制数长度为P,求出一个二进制数使得其和N个二进制数的complaint之和最小。complaint=不相同的bit的个数。另外有M个constraint,求出的二进制数不能出现在constraint中。
A:
思路:
- 用一个长度为P的数组,每一位存储里面有多少个当前位为1的数;
- 使用DP,存入每次为0或为1产生的cost。
best = [[0,""]] # [[cost, type]]
for i in xrange(P):
cur = []
for cost, typ in best: # 对于前一位已经算完的每一种type
cur.append([cost + cost_of_option[i], typ+'0']) # cost加上为0时产生的complaint,记录当前typ+‘0’
cur.append([cost + N - cost_of_option[i], typ+'1']) # cost加上为1时产生的complaint,记录当前typ+‘1’
best = sorted(cur)[:,101] # 按照cost排序,由于M最大为100,前101位至少能有一个不在constraint中
# 在best中找到第一个不属于constraint的值