9.2美团
100 100 6.67 45 100
想问问各位哥第三题怎么写
就是那个要使第一个数最大的最小操作数
例如:
4
1 2 3 4
输出:
2
可对任一元素x2或/2向下取整。
每次笔试遇到这种题目都不会
想问问各位哥第三题怎么写
就是那个要使第一个数最大的最小操作数
例如:
4
1 2 3 4
输出:
2
可对任一元素x2或/2向下取整。
每次笔试遇到这种题目都不会
全部评论
记录首个元素,排序,如果记录元素不是排序后的倒数第二个直接乘2直到大于,是倒数第二个判断一下最大的除2个数与乘2个数比较
第三题样例很少,很多100%的其实不对。比如1 2 5 这个其实只需要2次,但是看评论的一些方法需要3次。我的思路是,找出最大元素,和次大元素,先把最大元素/2,直到“将”要比次大元素小。在把第一个元素*2直到比次大元素大。再看下此时和最大元素比还需不需要再乘一次2。这个正确性证明:如果此时想让第一个元素少乘一次2,就要让最大和次大都要/2,所以肯定步数会变多。而对于最大元素,其除2向下取整比第一个元素*2要小的多一些,肯定贪心希望最大元素尽量除2(比如1,2,5这种5/2=1肯定比2*2划算)。
猜了一个首位不是前二就乘法,否则除法,过了…
正难则反,你只需要枚举需要增加多少次。这个增加显然只会对a[1] 增加,然后判断剩下的元素需要减少多少次。这样复杂度就是( log(1e9) * N)。
第三题写了个dp通过了85%
找到最大数,往下取整除不就行了
把除了第一个数都放进优先队列,每次取出比较一下然后除2放回
就只有一种情况,全数组只有个数大于第一个数,并且这个数%2=1。这种情况用这个数/2会比直接乘2第一个数少一次
先遍历找到最大数,然后只要第一个数还大于最大数就判断,如果最大数mod2余1,那就最大数除2,要不然就第一个数乘2,这样直到第一个数大于最大数,退出循环,返回操作的个数结果就行
大佬,问下第二题怎么做的,我只过了90多😭😭
第三题我是这么做的,先把除第一个数以外的数字升序排序,然后分两个方向计算,一个从左往右,一个从右往左。第一种只需要计算第一个数字跟最后一个数字差了几倍就可以了,连续乘2直到大于等于最后一个数字,乘的次数就是从左往右的结果。然后再从右往左,先从最后一个数字开始,所有大于第一个数的数字都连续除以2直到小于等于第一个数字,所有除以二的次数加起来就是从右往左的计算结果,最后两种方向的结果取最小值就是答案。
我用的最大堆,每次要么第一个翻倍,要么减半最大值再比较,每一步都贪婪取最大缩短差距的那个方案(维护一个 max-min的差值变量);
把第一个数字拿出来,剩下的从小到大排序,并遍历i=1->n-1,如果第一个数字小于当前的a[i],则让第一个数字*=2知道大于等于;如果大于直接跳过。
最后若是走到n-1的位置,则判断a[n-1]/=2所需的步数,和a[0]*=2的步数(直到a[0]>a[n-1])的最小值,用最小值更新一下答案。
这样一来1 2 5的例子,一开始1会和2比大小,然后a[0]变成2,然后和5比大小,发现5/=2比1*2*2要用的次数少,所以最后的答案就是2.
当时这样考虑贪心是因为,如果你当前的a[0]没和最后一位数字比大小,那么不需要让最后的a[n-1]除以2,因为前面还有很多没比过大小的n-2,n-3等等的位置,这些位置如果你想执行除以2的操作,那实际上肯定不如a[0]*=2的操作快。所以真正要比较的只有a[0]和a[n-1]
把第一个数提出来 剩下的找出最大的那个数循环/2,每除一次结果加一,直到比第一个数小或者相等。通过100
排序数组nums[1, n],第一个数依次乘2,直到剩余最后一个数,最后一个数除以2
要维护一个堆吧,当然如果图省事情可以直接第一个数乘2,也可以过83
相关推荐
10-16 22:56
门头沟学院 C++ 点赞 评论 收藏
分享