双是整数卡片

整数卡片问题解析

题目见《整数卡片》《又是整数卡片》

---------------------------------------------------------------------------------------------------------------------------------

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int amo,num;
    bool operator<(const node &other) const
    {
        return num < other.num;
    }
};
priority_queue<node>que;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        que.push({1,a});
    }
    for(int i=1;i<=m;i++)
    {
        int b,c;
        cin>>b>>c;
        que.push({b,c});
    }
    long long sum=0;
    int q=0;
    while(true)
    {
        if(n-q<que.top().amo)
        {
            sum+=1ll*(n-q)*que.top().num;
            break;
        }
        else
        {
            sum+=1ll*que.top().amo*que.top().num;
            q+=que.top().amo;
            que.pop();
        }
    }
    cout<<sum;
    return 0;
}

---------------------------------------------------------------------------------------------------

整数卡片:

这道题我前面写的时候问题不大,结果后面写着写着发现超时了,我爸爸说是因为遍历map的时候没有erase。

但是erase之后又RTE了,因为在用AUTO遍历的时候,是不能修改的,会影响红黑树的结构。

所以我开了一个vector,把要erase的下标都存了进去,最后再一块儿erase就好了。这种方法叫“在线算法”。

又是整数卡片:

老师评论了“整数卡片”之后,我用老师的方法又写了一编,果然方便多了。这种方法叫“离线算法”。
双是整数卡片:

用的离线优先队列,比登天还难!

皇上大人专门下圣旨派我吐槽一下这个反人类的优先队列。不用struct的时候,默认大根堆,而且改小根还特复杂。有struct时用不了cmp就算了,operator大根堆居然用小于号!

### 蓝桥杯竞赛中的Python卡片换位问题分析 蓝桥杯竞赛中涉及的卡片换位问题是典型的算法设计题目之一,通常考察选手对于字符串操作、数组处理以及逻辑推理的能力。以下是针对该类问题的一种通用解题思路及其具体实现方法。 #### 1. 题目背景概述 此类问题的核心在于通过一系列规则对一组数据(通常是字符或整数)进行重新排列。假设输入是一组有序的数据序列,目标是对这些数据按照特定条件完成位置交换或其他形式的操作[^1]。 #### 2. 解题核心思想 解决这类问题的关键是理解并抽象化其基本操作模式。常见的策略包括但不限于以下几种: - **模拟法**:逐一遍历给定的初始状态,并依据题目描述逐步调整各个元素的位置。 - **指针技术**:当涉及到两部分子集之间的交互时,可以考虑采用两个索引来分别追踪不同区域的状态变化过程[^2]。 - **哈希表辅助存储映射关系**:如果存在复杂的匹配需求,则可能需要用到字典或者集合来记录中间计算结果以便快速查找对应项[^3]。 #### 3. 实现方案举例说明 下面给出一段基于上述提到的方法论编写而成的具体代码实例作为参考: ```python def card_reposition(cards, operations): """ 执行一系列卡片置换指令 参数: cards (list): 初始卡片列表 operations (list of tuples): 各种操作命令组成的元组列表 返回值: list: 经过所有变换后的最终卡片顺序 """ for op in operations: action_type, *params = op if action_type == 'swap': idx_a, idx_b = params # 进行指定下标的互换动作 cards[idx_a], cards[idx_b] = cards[idx_b], cards[idx_a] elif action_type == 'reverse_subarray': start_idx, end_idx = params subseq = cards[start_idx:end_idx+1][::-1] cards[start_idx:end_idx+1] = subseq return cards if __name__ == "__main__": sample_cards = ['A', 'B', 'C', 'D'] ops_example = [ ('swap', 0, 3), ('reverse_subarray', 1, 2) ] result = card_reposition(sample_cards.copy(), ops_example) print(result) # 输出应为['D', 'C', 'B', 'A'] ``` 此段程序定义了一个名为`card_reposition`的功能函数用于接收原始卡牌布局与待执行的一系列转换指示;其中每条指示由一个表示行为类型的标签加上必要的参数构成。随后,在循环体内根据不同种类的动作调用相应的内部逻辑实施改变直至结束整个流程返回修改完毕的新版队列结构[^4]。 #### 4. 性能考量因素 需要注意的是实际比赛中可能会面临更大规模的数据量级挑战因此除了正确性之外还需要兼顾效率方面的优化措施比如减少不必要的内存分配次数提高访问速度等等[^5]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值