题目来自牛客网网友分享的腾讯面经
题目描述:
给两个数N,k
每一轮可以进行两种操作的其中一种
1. 所有的数拆分成两个更小的数
2. 所有的数-1
已知拆分操作只能进行k次
问 最少需要多少次把所有数都消去
分析,由于拆分和减一操作是针对所有数,且求最小的操作次数,所以
- 1.每次拆分后的两个数字之间要尽可能的相等,或差最小;
- 2.拆分的次数要尽可能的多,减一操作的数目要尽可能的少;
- 3.拆分后的两个数的最小值要大于等于1;
解法:
def split_nums(n,k):
sub_max = n #记录每次拆分后的最大值
count = 0
while k and sub_max>1: #比较条件是拆分后的值大于1
if sub_max%2==0:
sub_max = sub_max//2
else:
sub_max = sub_max//2+1
k-=1
count+=1
while sub_max:
count+=1
sub_max-=1
return count
网友评论