开发者社区> 问答> 正文

遇到一个钱庄问题,求解答。

钱庄每天能够收到很多散钱,第i个散钱的值 2^wi。为了便于管理,钱庄每天都会向中央银行申请兑换钱币,假设钱庄有一些散钱使得 2^k1+2^k2+...+2^km=2^x(x为非负整数),那么就可以将这些散钱兑换成一个大钱币,问在钱庄收到的这些散钱最终最少能变成几个钱币?输入一个整数 n,表示一共有 n 个钱币 (1<=n<=10^6);再输入n个整数 wi,表示有价值 2^wi(0<=wi<=10^6)的钱币。输出兑换后最少的钱币数。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 15:51:42 413 0
1 条回答
写回答
取消 提交回答
  • 遍历一遍m找出m中的最大数max定义一个数组arr[max+2],用于统计出m数组中,每个数字出现的次数,即arr[m[i]]++(m中的元素为下标,arr 数组中保存出现的数);再次遍历 arr 数组 (0<=i<=max),如果当前元素 arr[i]==0,那就下一个,如果不为 0,arr[i+1]+=arr[i]/2;( 每两个 arr[i] 就能凑一个 arr[i+1])如果 arr[i] 为奇数,那说明剩余一个 arr[i],这最后也就剩下了,所以 ans++;遍历完后 if(arr[max+1]!=0)ans++; 然后 returnans; 则输入:4 [1,1,2,3] 输出:1

    2021-12-23 18:25:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载