牛客小白月赛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;
}
全部评论

相关推荐

06-27 18:53
门头沟学院 Java
这样才知道自己不适合搞代码,考公去咯
只爱喝白开水:我也发现不适合搞代码,打算转非技术方向了
点赞 评论 收藏
分享
下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
06-26 10:08
门头沟学院 C++
北京Golang实习,一个月4700,吃住都不报,公司位置在海淀。请问友友怎么看呢?如果要租房的话有什么建议吗
码农索隆:租房肯定是合租了,剩下的钱,差不多够正常吃饭了,看看能不能学到东西吧
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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