牛客小白月赛41 C 小红的口罩

小红的口罩

https://ac.nowcoder.com/acm/contest/11218/C

首先很容易想到一个朴素做法,每次 O(n)O(n) 寻找最小值,然后操作。

这样的复杂度是大约 O(n2)O(n^2) 的,无法通过。

然后观察该做法,发现这个 O(n)O(n) 寻找最小值非常累赘。

采取小根堆每次寻找最小值、然后删除最小值、同时加入原最小值翻倍后的值,复杂度均为 O(1)O(1)

大概答案最多是 nn 天,于是总复杂度 O(n)O(n)

代码很简短的:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

priority_queue <ll, vector<ll>, greater<ll> > q;
//小根堆,保险地开long long

int n, k;

int main () {
    cin >> n >> k;
    
    for (int i = 1, x; i <= n; i ++) {
        cin >> x;
        
        q.push (x);
    }
    
    int sum = 0, ans = 0;
    
    while (1) {
        int t = q.top ();

        if (sum + t > k) {
            break;
        }
        
        sum += t;
        
        q.pop (), q.push (t * 2);
        
        ans ++;
    }
    
    cout << ans;
    
    return 0;
}
全部评论
小根堆删除操作并不是 $O(1)$ 而是 $O(\log n)$,而且答案也并不是 $n$ 天
点赞 回复 分享
发布于 2025-12-19 01:10 上海

相关推荐

01-12 20:31
东北大学 Java
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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