题解 | #除2!#

除2!

https://ac.nowcoder.com/acm/problem/213140

涉及算法:模拟+贪心+堆
思路:
  1. 将所有偶数都放进一个大堆heap中
  2. 每次除2时,取出堆顶(最大的偶数)元素top进行除2操作。判断操作后的top是否为偶数,如果是,则将它插入到堆heap中;如果不是,则将最终结果加上该奇数。重复次操作,直到堆为空或执行完k次
C++代码实现:
#include <iostream>
#include <queue>
using namespace std;

int n, k;

long long sum; // 统计最终的和

int main()
{
    // 建一个大堆
    priority_queue<long long> heap;
    cin >> n >> k;
    
    int t = 0;
    while(n--)
    {
        cin >> t;
        if(t % 2 != 0) sum += t; // 奇数,则计算和
        else heap.push(t); // 偶数,则插入堆中去
    }
    
    // k次除2
    while(k-- && !heap.empty())
    {
        // 选出堆顶元素(最大的偶数)进行除2
        int top = heap.top() / 2;
        if(top % 2 != 0)
        {
            sum += top;
            heap.pop();
        }
        else
        {
            heap.pop();
            heap.push(top);
        }
    }
    
    // 处理堆中剩余的元素
    while(!heap.empty())
    {
        sum += heap.top();
        heap.pop();
    }
    
    cout << sum; 
    return 0;
}
全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:矛盾是没有实习,就是没实战经验,公司不想要,公司不要,你就没有实习,你就进入死循环,另外你的项目不是社会现在有大量岗位存在行业用的,云存储人员早就饱和。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务