蓝桥杯2024年第十五届省赛真题-爬山

题目链接:

思路:

策略:每次都对最高的山使用魔法

①我们用大根堆存所有山的高度,每次取根节点,就是最大值。
②当两种魔法使用次数不为0,对取出的最大山的高度 t 使用魔法, 第一种魔法将高度变成 x, 第二种魔法将高度变成 y。 对 x, y比较,谁更小就用那种魔法,该魔法使用次数-1,将新的高度添加到大根堆中。
③当第二种魔法使用次数为0,将 sqrt(t) 添加到大根堆中,第二种魔法使用次数 -1。当第一种魔法使用次数为0,将 t/ 2 添加到大根堆中,第一种魔法使用次数 -1。

代码:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N  = 1000010;

int n, P, Q;
//大根堆
priority_queue<int, vector<int>, less<int>> q;
//答案
int ans;

signed main(){
    cin >> n >> P >> Q;
    for(int i = 1; i <= n; i++){
        int x; cin >> x;
        //从大到小排序
        q.push(x);
    }
    // //找到最小体力值
    while(P != 0 || Q != 0){
        //取出堆最大值
        auto t = q.top();
        //在堆中去掉最大值
        q.pop();
        //P Q 不为0
        if(P != 0 && Q != 0){
            int a = sqrt(t), b = t/2;
            if(a < b){
                q.push(a);
                P--;
            }
            else if(b < a){
                q.push(b);
                Q--;
            }
        }
        else if(P == 0 && Q != 0){
            q.push(t/2);
            Q--;
        }
        else if(P != 0 && Q == 0){
            q.push(sqrt(t));
            P--;
        }
    }
    

    while(q.size()){
        auto x = q.top();
        q.pop();
        ans += x;
    }
    
    cout << ans << endl;
    return 0;
}
相关推荐
骑驴看星星a2 天前
P10987 [蓝桥杯 2023 国 Python A] 火车运输
职场和发展·蓝桥杯
a东方青3 天前
[蓝桥杯 2023 国 B] AB 路线 (BFS)
c++·算法·职场和发展·蓝桥杯·宽度优先
咚咚轩3 天前
蓝桥杯第十届国B 求值
蓝桥杯
a.3025 天前
蓝桥杯等竞赛场景下 C++ 的时间与空间复杂度深度解析
c++·蓝桥杯
KuaCpp5 天前
蓝桥杯刷题
蓝桥杯
黑学生5 天前
2024蓝桥杯C/C++ B组国赛
c语言·c++·蓝桥杯
jinmo_C++6 天前
第十四届蓝桥杯_省赛B组(C).冶炼金属
c语言·职场和发展·蓝桥杯
wuqingshun3141597 天前
蓝桥杯 冶炼金属
算法·职场和发展·蓝桥杯
MoRanzhi12037 天前
245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推
python·算法·蓝桥杯·国赛·递推·2019
理智的灰太狼8 天前
题目 3241: 蓝桥杯2024年第十五届省赛真题-挖矿
职场和发展·蓝桥杯