除2!

除2!

https://ac.nowcoder.com/acm/contest/8563/A

想要一个房间,带有落地窗。摆一张双人床,一个小书桌。早晨醒来,喜欢的人睡在旁边,随时看窗外风景,有灵感了便在小书桌上写写画画,没事的时候摆弄摆弄花草,傍晚 灯光昏暗透过落地窗可以盯着夕阳发呆 想想明天吃什么。平平淡淡地过完一生,碌碌无为也没有关系。

​ ----向往的生活

题目描述

给一个数组,一共有 img个数。
你能进行最多 img次操作。每次操作可以进行以下步骤:

选择数组中的一个偶数 ai,将其变成 ai/2。

现在你进行不超过 img次操作后,让数组中所有数之和尽可能小。请输出这个最小的和。

题目分析

题目要求在进行不超过k次操作后,让所有数之和尽可能小,那么利用贪心的思想,我们每一次操作都对当前数组中最大的数进行操作,这样经过k次之后就能求出最小之和,在这里我们需要两个东西,一个是需要自动排序的功能的数组,一个是要动态的加入当前数组中,那么由此我们可以想到优先队列,定义一个大根堆,每次操作的时候把当前堆顶的元素取出来,操作之后,我们把新的元素加进队列,这样就始终维护一个大根堆,进行k次操作之后,就能得到最小值

AC代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
int n, k;
ll a[maxn];

priority_queue<int, vector<int>, less<int> >q;
int main()
{
    scanf("%d%d", &n, &k);
    ll ans = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        if (a[i] & 1)
            ans += a[i];
        else
            q.push(a[i]);
    }
    while (!q.empty() && k)
    {
        int now = q.top();
        q.pop();
        now /= 2;
        k--;
        if (now & 1)
            ans += now;
        else
            q.push(now);
    }
    while (!q.empty())
    {
        ans += q.top();
        q.pop();
    }
    printf("%lld\n", ans);
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
01-05 18:00
嘉应学院 Java
七牛云头号黑子:一个并发项目+一个轮子项目,两个项目即可,有开源/博客可以写,没内容别写。3段实习没一个有含金量的,3个项目没一个并发项目,第一个tob项目业务方面也不可能用的是这个技术,一眼假。第二个项目,一个公司得多差劲需要你来重构权限模块,订单模块和优惠券模块你也做了,咋可能,很多公司订单模块就是直接独立出来的,要么项目不行,要么你在吹。第三个项目,大部分都在讲对接第三方和SpringAI框架的能力,这东西按照文档对这写就写出来了,没啥难度,没亮点。通病:项目描述全是在讲技术,没有讲清楚为什么要做这个,原技术是什么?基于什么考量替换的技术。实习内容明显包装痕迹且东一块西一块,纯拼凑。建议:去做并发项目,轮子项目,试着做点开源和博客,别再去小公司实习了,没意义,先投中厂,27届还早,加油。大概看了一下可能有说的不对的地方。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

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