Least wasteful use of stamps to achieve a given postage
we have 2 kinds of stamp with values $A and $B, The number of stamps is infinite, we have a letter to send out and need $T postage, question is to find out the lowest cost required to get $T postage? Pls describe your method and code it with any language you are good at( even we perfer C/C++ :)。
example as below,
Input:A B T 1 ≤ A < B ≤ 10e9 1 ≤ T ≤ 10e9 A, B, T are integers
Output: The lowest value of 2 kinds of stamps combination which should be >= $T
defyet_another_solution(a, b, t): n = math.ceil(t / b) cost = [] for i inrange(n + 1): j = math.ceil((t - i * b) / a) cost.append({'cost': i * b + j * a, 'num_of_a': j, 'num_of_b': i})
cost.sort(key=lambda x: x.get('cost'))
return cost[0]
然后面试官发来追问
你好,循环是可以这样做的,那我再追问下, A, B比较小, T比较大的时候,在小的Embedded设备上耗时比较多,请问有没有好的办法可以加速?
if is_co_prime: mystery_number = a * b - a - b if mystery_number < t: # Coin problem optimization return t else: ifnot b % a: # A ÷ B ∈ ℤ optimization num_of_a = math.ceil(t / a)
ifnot t % a: return t
return num_of_a * a
# A ÷ B ∉ ℤ case # @see https://math.stackexchange.com/q/3430648 mystery_number = ((a * b) / gcd ** 2 - (a + b) / gcd + 1) * gcd
if mystery_number < t: num_of_a = math.ceil(t / gcd)
ifnot t % gcd: return t
return num_of_a * gcd
return yet_another_solution(a, b, t).get('cost')
if __name__ == '__main__': print(main(29, 42, 320))
最多能换几张免费机票
你经常做飞机,现持有国航5种Coupon状况如下 种类 A 的 a 张 种类 B 的 b 张 种类 C 的 c 张 种类 D 的 d 张 种类 E 的 e 张
你想换一张免费机票,条件如下 种类 A, B, C 的Coupon各一张 或者 种类 B, C, D 的Coupon各一张 或者 种类 C, D, E 的Coupon各一张 或者 种类 D, E, A 的Coupon各一张 或者 种类 E, A, B 的Coupon各一张
问最多能换几张免费机票? Input a, b, c, d, e Output 免费机票数
这题一开始我是完全没思路的, 连 Google 关键字都想不出来, 后面求助万能的网友得到一个答案, 果断抄作业
defyet_another_solution(a, b, c, d, e, result=0): coupons = [a, b, c, d, e] length = 5 score_list = [] for x inrange(length): y = x + 1if x + 1 < length else x + 1 - length z = y + 1if y + 1 < length else y + 1 - length