备战蓝桥杯---数据结构与STL应用(入门3)

news2024/11/24 9:06:02

我们先来一道题作为过渡:

我们只需枚举n,选出左右第一个小于它高度的坐标即可,于是我们可以用两个方向的优先队列来维护,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
struct node{
    int index,tall;
}a[100010];
int b[100010],b1[100010];
signed main(){
    cin>>n;
    while(n!=0){
        for(int i=1;i<=n;i++){
            cin>>a[i].tall;
            a[i].index=i;
        }
        deque<node> q1;
        deque<node> q2;
        for(int i=1;i<=n;i++){
            while(!q1.empty()&&a[i].tall<q1.back().tall){
                q1.pop_back();}
            int f=0;
            if(!q1.empty()) {if(a[i].tall==q1.back().tall){
                f=1;
            }}
            if(q1.empty()) b[i]=0;
            else{
                if(f==0) b[i]=q1.back().index; 
                else b[i]=b[q1.back().index];
            }   
            q1.push_back(a[i]);
        }
        for(int i=n;i>=1;i--){
            while(!q2.empty()&&a[i].tall<q2.front().tall){
                q2.pop_front();}
            int f=0;
            if(!q2.empty()){if(a[i].tall==q2.back().tall){
                f=1;
            }}
            if(q2.empty()) b1[i]=n+1;
            else{
                if(f==0) b1[i]=q2.front().index;
                else b1[i]=b1[q2.back().index];
            }
            q2.push_front(a[i]);
        }
        long long max1=0;
        for(int i=1;i<=n;i++){
            max1=max(max1,a[i].tall*(b1[i]-b[i]-1));
        }
        cout<<max1<<endl;
        cin>>n;
    }
}

这里注意一下:

当两个高度相等时,我们要特殊处理一下,一方面,我们把它们正常添加以保证后面元素不出错。另一方面,他们的值应该定位到第一个出现该高度的值。

接下来,我们主要围绕优先队列来讲:

下面是分析:

其实这是一个典型的对顶堆,下面是图解:

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int p,m,xu,jj;
int main(){
    cin>>p;
    while(p--){
    priority_queue<int> q1;
    priority_queue<int,vector<int>,greater<int> > q2;
    cin>>xu>>m;
    cout<<xu<<" "<<(m+1)/2<<endl;
    int kk=0;
    for(int i=1;i<=m;i++){
        scanf("%d",&jj);
       if(q1.empty()&&q2.empty()) q1.push(jj);
       else if(q1.empty()||q2.empty()){
           if(q1.empty()){
               if(jj>=q2.top()) q2.push(jj);
               else q1.push(jj);
           }
           else{
               if(jj<=q1.top()) q1.push(jj);
               else q2.push(jj);
           }
       }
        else{
             if(jj>=q2.top()) q2.push(jj);
               else q1.push(jj);
        }
        if(q1.size()>q2.size()+1){
            q2.push(q1.top());
            q1.pop();
        }
        if(q2.size()>q1.size()+1){
            q1.push(q2.top());
            q2.pop();
        }
        if(i%2==1){
            if(kk==10) {cout<<endl;
                        kk=0;}
            if(q1.size()>q2.size()) printf("%d ",q1.top());
            else printf("%d ",q2.top());
            kk++;
        }
    }
    if(p!=0) cout<<endl;
    }
}

接下来来个十分好的问题:

下面为分析:

首先,我们容易想到用贪心,那怎么贪心呢?

其实,我们把每个元素在剩余序列上第一个位置最远的元素替换即可,这样子,我们保证它们会相比其他决策最先遇到与自己一样的值,也保证剩余序列上与缓存上的一样的值相比其他决策最靠前,因此正确性显然。

那我们如何维护呢?先用map把数据离散化,在维护一个next数组,序列上第一个位置最远的元素用优先队列维护即可。

注意,当i遇到重复的j直接加进即可,在j没离开时,i肯定不会在栈顶。j离开后,因为next[i]=j,后加的元素肯定》j,于是i就被一直忽略。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100010],tot,next1[100010],cun[100010],cnt,sum;
map<int,int> mp;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=n;i>=1;i--){
        if(mp.count(a[i])==0) next1[i]=n+1;
        else next1[i]=mp[a[i]];
        mp[a[i]]=i;
    }
    priority_queue<int> q;
    for(int i=1;i<=n;i++){
        if(cun[i]==1){
            q.push(next1[i]);
            cun[next1[i]]=1;
        }
        else{
            if(cnt<m){
                q.push(next1[i]);
                 cun[next1[i]]=1;
                sum++;
                cnt++;
            }
            else{
                cun[q.top()]=0;
                q.pop();
                q.push(next1[i]);
                 cun[next1[i]]=1;
                sum++;
            }
        }
    }
    cout<<sum;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter+go构建的即时通讯app,ChatCraft

前言 Hi&#x1f44b;all.好久不见&#xff0c;已经两个多月没有发文章了&#xff0c;这段时间一直在反思过去的一年&#xff0c;有好有坏。对博客文章这块我对自己是不满意的&#xff0c;文章的质量参差不齐&#xff0c;有时候在没有好的题材时&#xff0c;我会选择写一些泛泛…

9.SELinux

目录 1. 概述 1.1. 概念 1.2. 作用&#xff1a; 1.3. SELinux与传统的权限区别 2. SELinux工作原理 2.1. 名词解释 2.1.1. 主体&#xff08;Subject&#xff09; 2.1.2. 目标&#xff08;Object&#xff09; 2.1.3. 策略&#xff08;Policy&#xff09; 2.1.4. 安全上…

河南省考后天网上确认,请提前准备证件照哦

✔报名时间&#xff1a;2024年1月18号一1月24号 ✔报名确认和缴费&#xff1a;2024年1月 31号一2月4号 ✔准考证打印&#xff1a;2024年3月12号一3月17号 ✔笔试时间&#xff1a;2024年3月16日-2024年3月17日。 ✔面试时间&#xff1a;面试时间拟安排在2024年5月中旬 报名网址&…

ChatGPT学python: 用json文件传参

目录 json语法最简陋版python解析语法小结 json语法最简陋版 param.json [{"Table_name": "table1","Event_name_colum": 4,"update_colum": 9},{"Table_name": "table2","Event_name_colum": 3,&quo…

快速掌握,制作可发送上课通知小程序的秘籍

对于教育培训机构来说&#xff0c;及时通知学生上课时间、地点等重要信息是至关重要的。而现在&#xff0c;通过小程序&#xff0c;我们可以更加便捷地实现这一目标。下面将为你介绍如何制作一个可发送上课通知的小程序。 首先&#xff0c;通过百度搜索“乔拓云”&#xff0c;并…

NFS 网络文件系统

1. NFS简介 NFS&#xff08;Network File System 网络文件系统&#xff09;&#xff0c;是一种用于在计算机网络上共享文件的协议。它允许一个计算机系统通过网络将其文件和存储设备共享给其他计算机系统&#xff0c;使得这些系统可以像访问本地文件一样访问网络共享的文件。 N…

excel中提取一串数字中的某几个数字

excel中提取一串数字中的某几个数字 提取一串数字中的某几个数字&#xff0c;使用公式函数截取数据 LEFT函数&#xff1a;用于截取单元格左边的字符&#xff0c;例如“LEFT(A1,5)”会返回A1单元格中的前5个字符。RIGHT函数&#xff1a;用于截取单元格右边的字符&#xff0c;例…

如何設置動態住宅IP代理管理工具SwitchySharp插件

動態住宅IP代理管理工具SwitchySharp擴展程式專為Chrome設計&#xff0c;可讓用戶更輕鬆地管理代理設置&#xff0c;並以其簡單性和靈活性著稱。本文我們將討論SwitchySharp插件的功能、優點、如何設置。 Proxy SwitchySharp插件具體有什麼用&#xff1f; 此工具是專為Chrome設…

汽车软件开发模式的5个特点

汽车软件开发属于较为复杂的系统工程&#xff0c;经常让来自不同知识背景的工程师在观点交锋时出现分歧。在解决复杂性和对齐讨论基准时&#xff0c;可以通过勾勒出讨论对象最关键的几个特征来树立典型概念。本文旨在通过5个典型特点的抽取&#xff0c;来勾勒出汽车软件开发模式…

Flask 入门2:路由

1. 前言 在上一节中&#xff0c;我们使用到了静态路由&#xff0c;即一个路由规则对应一个 URL。而在实际应用中&#xff0c;更多使用的则是动态路由&#xff0c;它的 URL是可变的。 2. 定义一个很常见的路由地址 app.route(/user/<username>) def user(username):ret…

STM32 IIC电量计LTC2944

1 描述 LTC2944 可在便携式产品应用中测量电池充电状态、电池电压、电池电流及其自身温度。宽输入电压范围允许使用高达 60V 的多节电池。精密库仑反向积分电流通过电池正极端子与负载或充电器之间的检测电阻器。 电压、电流和温度由内部 14 位无延迟 ΔΣ™ ADC 测量。测量结…

GBASE南大通用数据库对与例程相关联的对象的权限

数据库服务器检查是否存在任何被引用的对象&#xff0c;并验证调用该例程的用户是否拥有访问被引用的对象的必要权限。 由例程引用的对象可包括&#xff1a; • 表和列 • 序列对象 • 用户定义的数据类型 • 由该例程执行的其他例程 当例程运行时&#xff0c;定义有效的权…

第六篇:express路由拆分(模块化)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 引言&#xff1a; &#x…

elasticsearch的基本使用

使用postman进行测试 如下图所示&#xff1a; 需要进行验证&#xff0c;请选择Authorization中的basic auth,填写账号以及密码。 添加ik中文分词 安装 IK 分词器插件&#xff1a; 下载 IK 分词器插件&#xff0c;可以从 GitHub 上的 elasticsearch-analysis-ik 页面下载最好…

学习使用vite+vue3的所遇问题总结

组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来&#xff0c;导致使用不了&#xff0c;出现以下报错 这是因为&#xff0c;如果不用setup&#xff0c;就得使用 export default …… setup 是后者的语法糖 在Vue.js中&#xff0c;你可以通过route对象…

Python学习--一个逻辑推理的猜数字的游戏

修订Pico Fermi Bagels猜数字游戏代码&#xff0c;仅用于学习Python。 运行界面如下&#xff1a; 修订的代码如下&#xff1a; # // # 提升逻辑思维猜数字小游戏 # BY&#xff1a;Al Sweigart alinventwithpython.com # 翻译&#xff1a;诚外无物 # 说明&#xff1a;一个逻辑…

微信小程序之下拉刷新事件、上拉触底事件和案例

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Android systemui 编译

目录 简介&#xff1a; 一、步骤 二、下载源码 三、环境配置 四、确定好需要编译版本 五、编译SystemUI 步骤1&#xff1a;进入源代码目录 步骤2&#xff1a;初始化编译环境 步骤3&#xff1a;选择目标设备 步骤4&#xff1a;编译SystemUI 步骤5&#xff1a;查找生成…

kubeadm安装K8S_v1.28.x容器使用docker

一&#xff0e;环境部署 1.1 基础环境配置&#xff08;只有1台服务器&#xff0c;作为masrer&#xff0c;也作为node使用&#xff09; [rootecs-cf5e ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootecs-cf5e ~]# uname -a Linux ecs-cf5e 3.10.0-11…

全志R128基础组件开发——显示与屏幕驱动①

RTOS 提供了一套完整的屏幕驱动&#xff0c;支持 RGB, i8080, SPI, DBI 格式的屏幕。 &#xff08;1&#xff09;RGB 接口 RGB接口在全志平台又称HV接口&#xff08;Horizontal同步和Vertical同步&#xff09;。有些LCD屏支持高级的功能比如 gamma&#xff0c;像素格式的设置…