蓝桥杯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;
}
相关推荐
梁下轻语的秋缘2 小时前
每日c/c++题 备战蓝桥杯(P2241 统计方形(数据加强版))
c语言·c++·蓝桥杯
咚咚轩15 小时前
蓝桥杯14届 数三角
蓝桥杯·stl
嗨信奥19 小时前
蓝桥杯青少 图形化编程(Scratch)编程题每日一练——小猫的城堡
青少年编程·蓝桥杯
Kent_J_Truman1 天前
最长字符串 / STL+BFS
蓝桥杯
wen__xvn1 天前
每日一题洛谷P8615 [蓝桥杯 2014 国 C] 拼接平方数c++
c++·职场和发展·蓝桥杯
CQY05311 天前
蓝桥杯2025年第十六届省赛真题-水质检测
职场和发展·蓝桥杯
YuforiaCode1 天前
第十一届蓝桥杯 2020 C/C++组 蛇形填数
c语言·c++·蓝桥杯
俺不是西瓜太郎´•ﻌ•`2 天前
二维差分数组(JAVA)蓝桥杯
java·开发语言·蓝桥杯
咚咚轩3 天前
蓝桥杯15届国赛 最小字符串
蓝桥杯
嗨信奥3 天前
蓝桥杯青少 图形化编程(Scratch)编程题每日一练——图形特效
青少年编程·蓝桥杯