蓝桥杯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;
}
相关推荐
夏天的阳光吖5 小时前
C++蓝桥杯实训篇(四)
开发语言·c++·蓝桥杯
小乐xiaole6 小时前
蓝桥杯 2025 C++组 省 B 题解
c++·蓝桥杯·深度优先
写不出bug的小李10 小时前
首次打蓝桥杯总结(c/c++B组)
职场和发展·蓝桥杯
SuperW12 小时前
蓝桥杯嵌入式十六届赛前复习总结与准备
职场和发展·蓝桥杯
wuqingshun31415913 小时前
经典算法 判断一个图中是否有环
java·开发语言·数据结构·c++·算法·蓝桥杯·深度优先
ChoSeitaku13 小时前
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
c++·蓝桥杯·图论
想成为配环境大佬14 小时前
P8739 [蓝桥杯 2020 国 C] 重复字符串
算法·蓝桥杯·贪心
A懿轩A15 小时前
2025年十六届蓝桥杯Python B组原题及代码解析
python·算法·蓝桥杯·idle·b组
wuqingshun31415916 小时前
经典算法 判断一个图是不是树
数据结构·c++·算法·蓝桥杯·深度优先
爱编程的小新☆20 小时前
2025年第十六届蓝桥杯省赛JavaB组真题回顾
算法·职场和发展·蓝桥杯