蓝桥杯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;
}
相关推荐
此生决int1 天前
算法从入门到精通——前缀和
c++·算法·蓝桥杯
2301_800895102 天前
第九届蓝桥杯国赛b组--备战国赛版h
蓝桥杯
WL_Aurora3 天前
备战蓝桥杯国赛【Day 18】
python·算法·蓝桥杯
210Brian3 天前
蓝桥杯单片机学习笔记(十二):V2026 大模板构建(上)
单片机·学习·蓝桥杯
WL_Aurora4 天前
备战蓝桥杯国赛【Day 17】
算法·蓝桥杯
此生决int5 天前
算法从入门到精通——滑动窗口
c++·算法·蓝桥杯
WL_Aurora5 天前
备战蓝桥杯国赛【Day 16】
python·蓝桥杯
奔跑的Ma~5 天前
第6篇:蓝桥杯C++进阶突破(难题拆解+算法优化,冲刺国赛高奖)
c++·算法·蓝桥杯·#蓝桥杯备战·#c++编程·编程竞赛
x_yeyue5 天前
2026第十七届蓝桥杯c++B组省赛题解
笔记·算法·蓝桥杯·acm·题解
handler015 天前
【C++ 算法竞赛基础】数论篇:核心公式、经典例题与高频模板
开发语言·c++·算法·蓝桥杯·数论·最大公约数·最小公倍数