永康网站建设内蒙古网站建设

莆田市城厢区盒子网络信息技术中心 2026/09/09 18:12:22

魔法收积木

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

考友反馈题目大意:现在有n堆积木,每堆积木都有正整数数量,魔法一次可以把积木数量一致的积木堆砍半,要求出使用魔法收完积木堆的最少要用多少次魔法。

输入描述

第一行输入n代表积木的堆数

第二行输入:n个正整数,用空格分割,表示每堆积木的个数。

输出描述

输出使用魔法收完积木堆的最少要用多少次魔法。

用例1

输入

4 4 4 4 4

输出

3

用例2

输入

2 3 4

输出

4

题解

思路:贪心

  1. 魔法一次可以把积木数量一致的积木堆砍半,为了让使用魔法次数少,就是尽可能让一次魔法处理尽量多堆的积木。
  2. 基于1,可以推导得到先将最大的值砍半,尽可能让它和小的值一同进行处理
  3. 这道题的基本逻辑就是:
    1. 统计所有积木堆,使用哈希表存储不同大小积木堆的个数,
    2. 每次将积木最多堆数量(x)砍半,使用魔法数量+1,更新哈希表mp[x/2] += mp[x]
    3. 不断重复2的逻辑直到所有堆积木数量都变为0结束。
  4. 根据3的逻辑,主要是跟踪最大积木数量,对于java和C++都有对用的map使用,python、c++和go可以使用优先队列 + map去处理。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; // 会自动按照key排序 记录不同数量积木数量 map<long, long> mp; for (int i = 0; i < n; i++) { long cnt; cin >> cnt; mp[cnt]++; } // 结果 long ans = 0; while (!mp.empty()) { auto it = prev(mp.end()); long x= it->first; long cnt = it->second; mp.erase(it); ans++; long nextX = x >> 1; if (nextX > 0) { mp[nextX] += cnt; } } cout << ans; return 0; }

JAVA

import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int n = Integer.parseInt(br.readLine().trim()); // TreeMap:有序 map,等价于 C++ map // key:积木数量,value:该数量出现的次数 TreeMap<Long, Long> mp = new TreeMap<>(); st = new StringTokenizer(br.readLine()); for (int i = 0; i < n; i++) { long x = Long.parseLong(st.nextToken()); mp.put(x, mp.getOrDefault(x, 0L) + 1); } long ans = 0; while (!mp.isEmpty()) { // 取当前最大 key(等价于 prev(mp.end())) Map.Entry<Long, Long> entry = mp.lastEntry(); long x = entry.getKey(); long cnt = entry.getValue(); mp.pollLastEntry(); // 删除最大 key ans++; long nextX = x >> 1; if (nextX > 0) { mp.put(nextX, mp.getOrDefault(nextX, 0L) + cnt); } } System.out.println(ans); } }

Python

importsysimportheapqfromcollectionsimportCounterdefmain():# 读取全部输入data=sys.stdin.read().strip().split()n=int(data[0])nums=list(map(int,data[1:1+n]))# 统计每种积木数量出现次数cnt=Counter(nums)# 用最大堆模拟取最大 key, python默认是最小堆,所以使用负数heap=[-xforxincnt.keys()]heapq.heapify(heap)ans=0whileheap:x=-heapq.heappop(heap)c=cnt.pop(x)ans+=1nx=x>>1ifnx>0:ifnxnotincnt:heapq.heappush(heap,-nx)cnt[nx]+=cprint(ans)if__name__=="__main__":main()

JavaScript

'use strict';constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letlines=[];rl.on('line',line=>{if(line.trim())lines.push(line.trim());});// 手写最大堆classMaxHeap{constructor(){this.data=[];}size(){returnthis.data.length;}// 插入元素push(val){this.data.push(val);this._siftUp(this.data.length-1);}// 弹出最大元素pop(){if(this.data.length===0)returnnull;consttop=this.data[0];constlast=this.data.pop();if(this.data.length>0){this.data[0]=last;this._siftDown(0);}returntop;}_siftUp(i){while(i>0){constp=Math.floor((i-1)/2);if(this.data[i]<=this.data[p])break;[this.data[i],this.data[p]]=[this.data[p],this.data[i]];i=p;}}_siftDown(i){constn=this.data.length;while(true){letmaxIdx=i;constl=2*i+1,r=2*i+2;if(l<n&&this.data[l]>this.data[maxIdx])maxIdx=l;if(r<n&&this.data[r]>this.data[maxIdx])maxIdx=r;if(maxIdx===i)break;[this.data[i],this.data[maxIdx]]=[this.data[maxIdx],this.data[i]];i=maxIdx;}}}rl.on('close',()=>{letidx=0;constn=Number(lines[idx++]);constnums=lines[idx].split(/s+/).map(Number);// Map: 记录每种积木数量出现的次数constmp=newMap();for(leti=0;i<n;i++){constx=nums[i];mp.set(x,(mp.get(x)||0)+1);}constheap=newMaxHeap();for(constkeyofmp.keys())heap.push(key);letans=0;while(heap.size()>0){// 最大数量个数letx=heap.pop();constcnt=mp.get(x);mp.delete(x);ans++;constnextX=x>>1;if(nextX>0){if(!mp.has(nextX))heap.push(nextX);mp.set(nextX,(mp.get(nextX)||0)+cnt);}}console.log(ans);});

Go

packagemainimport("bufio""container/heap""fmt""os")// 最大堆(int64)typeMaxHeap[]int64func(h MaxHeap)Len()int{returnlen(h)}func(h MaxHeap)Less(i,jint)bool{returnh[i]>h[j]}// 大顶堆func(h MaxHeap)Swap(i,jint){h[i],h[j]=h[j],h[i]}func(h*MaxHeap)Push(xinterface{}){*h=append(*h,x.(int64))}func(h*MaxHeap)Pop()interface{}{old:=*h n:=len(old)x:=old[n-1]*h=old[:n-1]returnx}funcmain(){in:=bufio.NewReader(os.Stdin)varnintfmt.Fscan(in,&n)// 记录不同数量积木数量mp:=make(map[int64]int64)// 最大堆h:=&MaxHeap{}heap.Init(h)fori:=0;i<n;i++{varxint64fmt.Fscan(in,&x)ifmp[x]==0{heap.Push(h,x)}mp[x]++}// 结果varansint64=0forh.Len()>0{// 取最大x:=heap.Pop(h).(int64)ifmp[x]==0{continue}cnt:=mp[x]delete(mp,x)ans++nx:=x>>1ifnx>0{ifmp[nx]==0{heap.Push(h,nx)}mp[nx]+=cnt}}fmt.Println(ans)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

深圳网站建设桂林网站建设

前言人工智能技术席卷全球,成为下个工业技术革命的核心。人们在享受人工智能带来的便利的同时,不少人也面临着人工智能抢饭碗的威胁,而且已经有了越来越多的用人单位行

2026/06/30 12:22:31

湖南营销型网站建设网站建设与网页制作

Odometer是一款专业的JavaScript数字动画库,能够以平滑流畅的方式实现数字之间的过渡效果。无论你是需要展示网站访问量、销售额数据,还是创建动态仪表盘ÿ

2026/06/30 14:01:38

医院网站建设方案网站的建设

当人类智慧遇见机器效率在软件测试领域,人工测试与自动化测试的二分法正逐渐被“人机协作”的新范式取代。这不是简单的工具辅助,而是人类专业判断与机器精准执行的深度融合。随着人工

2026/06/30 10:08:18

中国建设银行官方网站东阳网站建设

AI图像生成成本分析:自建VS商用API费用对比在AI图像生成技术快速发展的今天,企业与开发者面临一个关键决策:是选择自建本地化生成系统,还是依

2026/06/30 13:00:04

怎么建设网站龙岩网站建设

Gmail邮件安全过滤新范式:用Qwen3Guard-Gen-8B构建智能审核系统在企业通信日益频繁的今天,Gmail 已成为无数团队的核心协作工具。但随之而来的ÿ

2026/06/30 14:16:09

厦门网站建设网站建设与维护

目录8.1图像色彩调整基础8.1.1 色彩模式的转换1. 色彩模式转换注意问题2. 各种色彩模式之间的转换8.1.2 图像的色调调整1. 色阶与自动色阶2. 曲线调整3. 亮度与对比度命令4. 色彩平

2026/06/30 10:12:49

旅游网站建设网站建设电话

快速体验打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容:使用HUMAN3.0提示词快速生成一个完整的Web应用前后端代码࿰

2026/06/30 13:58:08

番禺网站建设四川省建设厅网站

MyBatisPlus 和 VoxCPM-1.5-TTS-WEB-UI 的真实关系解析在当前AI技术迅猛发展的背景下,开发者常常会遇到这样一个困惑:某个后端框架是否支持或集

2026/06/30 11:51:28

网站建设心得襄樊网站建设

摘要随着信息技术的快速发展,体育行业的管理模式逐渐向数字化、智能化转型。篮球联盟作为体育产业的重要组成部分,其管理效率和信息处理能力直接影响到联赛的运营水平和用户体验。传统

2026/06/30 12:58:33

东莞手机网站建设六安网站建设

Pixso国产替代:团队协作设计DDColor品牌视觉体系在老字号品牌焕新、城市记忆数字化、家族影像修复等项目中,一个共通的挑战摆在设计师面前:如何让泛黄模糊

2026/06/30 13:32:36