备战蓝桥杯---数据结构之好题分享1

最近几天在刷学校的题单时,发现了几道十分巧妙又有启发性的题,借此来记录分享一下。

看题:

从整体上看似乎没有什么规律,于是我们从小地方入手,下面是图解:

因此,我们用栈的数据结构实现即可,下面是AC代码:

     #include <iostream>#include <cstring>#include <stdio.h>#include <algorithm>#include <stack>using namespace std;#define int long longint t,n,c[100010],q[100010],sum;bool cmp1(int a,int b){return a>b;}bool cmp2(int a,int b){return a<b;}struct node{int x,zhi;}ck[200010];bool cmp(node a,node b){return a.zhi<b.zhi;}stack<node> st;signed main(){scanf("%d",&t);while(t--){sum=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&ck[i].zhi);ck[i].x=0;}for(int i=n+1;i<=2*n;i++){scanf("%d",&ck[i].zhi);ck[i].x=1;}int cnt=0;for(int i=1;i<=n;i++) scanf("%d",&c[i]);sort(c+1,c+n+1,cmp1);sort(ck+1,ck+2*n+1,cmp);for(int i=2*n;i>=1;i--){if(ck[i].x==1) st.push(ck[i]);else{q[++cnt]=st.top().zhi-ck[i].zhi;st.pop();}}sort(q+1,q+n+1,cmp2);for(int i=1;i<=n;i++){sum+=q[i]*c[i];}cout<<sum<<endl;}}

接题:

第一眼以为就是一个用链表实现的模拟,然后直接暴力直接超时。因为最坏的情况为n^2,铁定超时,于是我们可以优化一下。

该怎么优化呢?我们借鉴SPFA的优化思想,计算更新后的点的左右情况。

因为如果一个怪物左右两边的怪都没死,下一次它也不会死,肯能死的怪物左右一定有一个在当局死了。因此,我们可以用队列,把当局死了的存在里面,下一次枚举他们检验可能死的怪,这样复杂度就优化成o(3n),下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int att,de,next,left;
}a[300010];
int b[300010],t,n,head;
queue<int> q2,q1;
void deletemy(int i){if(i==head) head=a[i].next;else if(a[i].next==-1) a[a[i].left].next=-1;else{a[a[i].next].left=a[i].left;a[a[i].left].next=a[i].next;}
}
int main(){scanf("%d",&t);while(t--){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();memset(b,0,sizeof(b));scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i].att);for(int i=1;i<=n;i++) scanf("%d",&a[i].de);for(int i=1;i<=n;i++){a[i].next=i+1;a[i].left=i-1;}a[n].next=-1;head=1;for(int i=1;i<=n;i++){if(a[i].next==-1){if(a[i].de<a[a[i].left].att){q2.push(i);b[i]=1;}	}else if(i==head){if(a[i].de<a[a[i].next].att){q2.push(i);b[i]=1;}}else{if(a[i].de<a[a[i].left].att+a[a[i].next].att){q2.push(i);b[i]=1;}}}printf("%d ",q2.size());while(!q2.empty()){q1.push(q2.front());deletemy(q2.front());q2.pop();}int k=n-1;while(k--){while(!q1.empty()){int j=q1.front();q1.pop();int i1=a[j].left;int i2=a[j].next;if(i1>=head&&b[i1]==0){if(a[i1].next==-1){if(a[i1].de<a[a[i1].left].att){b[i1]=1;q2.push(i1);}	}else if(i1==head){if(a[i1].de<a[a[i1].next].att){q2.push(i1);b[i1]=1;}}else{if(a[i1].de<a[a[i1].left].att+a[a[i1].next].att){q2.push(i1);b[i1]=1;}}}if(i2!=-1&&b[i2]==0){if(a[i2].next==-1){if(a[i2].de<a[a[i2].left].att){q2.push(i2);b[i2]=1;}	}else if(i2==head){if(a[i2].de<a[a[i2].next].att){q2.push(i2);b[i2]=1;}}else{if(a[i2].de<a[a[i2].left].att+a[a[i2].next].att){q2.push(i2);b[i2]=1;}}	}}printf("%d ",q2.size());while(!q2.empty()){q1.push(q2.front());deletemy(q2.front());q2.pop();}}printf("\n");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算基础-虚拟化概述

虚拟化概述 虚拟化是一种资源管理技术&#xff0c;能够将计算机的各种实体资源&#xff08;如CPU、内存、磁盘空间、网络适配器等&#xff09;予以抽象、转换后呈现出来并可供分割、组合为一个或多个逻辑上的资源。这种技术通过在计算机硬件上创建一个抽象层&#xff0c;将单台…

【HarmonyOS】ArkUI 组件(四)

List 列表&#xff08;List&#xff09;是一种复杂容器&#xff0c;具备下列特点&#xff1a; 列表项&#xff08;ListItem&#xff09;数量过多超出屏幕后&#xff0c;会自动提供滚动功能。列表项&#xff08;ListItem&#xff09;既可以纵向排列&#xff0c;也可以横向排列…

Oracle19c PDB的简介与创建

多租用户环境&#xff08;Multitenant Environment&#xff09;&#xff0c;允许一个数据库容器&#xff08;CDB&#xff09;承载多个可插拔数据库&#xff08;PDB&#xff09;。 首先&#xff0c;毋庸置疑的是pdb只能在cdb root下创建&#xff0c;每个cdb里面都有一个pdb$seed…

springboot194基于springboot的医药管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的医药管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **…

Mysql Day06

sql优化 插入数据 大批量插入数据 主键顺序插入性能高于乱序插入 load data local infile /root/load_user_100w_sort.sql into table tb_user fields terminated by , lines terminated by \n ; 主键优化 这个黄色的都是一个一个Page 主键乱序插入之后会变成1-3-2&#x…

[BUUCTF]-PWN:ciscn_2019_es_1解析(tcachebin duf)

查看保护 再查看ida 大致为alloc创建堆块&#xff0c;free释放堆块&#xff0c;show输出堆块内容 但是要注意一点free没有清空堆块指针 完整exp&#xff1a; from pwn import* from LibcSearcher import* pprocess(./es1) premote(node5.buuoj.cn,26841)def alloc(size,cont…

SQL中的各种连接的区别总结

前言 今天主要的内容是要讲解SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别和用法&#xff0c;不用我说其实前面的这些基本SQL语法各位攻城狮基本上都用过。但是往往我们可能用的比较多的也就是左右连接和内连接了&#xff0c;而且对于许多初学…

CSP-201903-2-二十四点

CSP-201903-2-二十四点 一、中缀表达式转后缀表达式 中缀表达式是一种常见的数学表达式书写方式&#xff0c;其中操作符位于相关的操作数之间&#xff0c;如 A B。而后缀表达式&#xff08;逆波兰表示法&#xff09;则是一种没有括号&#xff0c;操作符跟随操作数之后的表示…

使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南

导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro&#xff0c;作为一个多端统一开发框架&#xff0c;让开发者能够使用一套代码同时适配多个平台&#xff0c;包括鸿蒙系统。文章将详细介绍如何配置开发环境&#xff0c;以及如何利用 Taro 的特性…

紫微斗数双星组合:天机天梁在辰戌

文章目录 前言内容总结 前言 紫微斗数双星组合&#xff1a;天机天梁在辰戌 内容 紫微斗数双星组合&#xff1a;天机天梁在辰戌 性格分析 在紫微斗数命盘中&#xff0c;天梁星是一颗“荫星”&#xff0c;能够遇难呈祥&#xff0c;化解凶危&#xff0c;主寿&#xff0c;主贵。…

私立医院患者大数据分析平台建设方案

一、项目目标 1、数据质量,统计数字不仅是真实可信,而且要及时,便于及时判断企业经营情况,同时通过内外部数据的对标,发现企业经营问题。 2、提供指标的监控预警,为决策提供支持,减少杂乱无用报表的生产。 3、提升数据处理效率,提高报表的可用性,让数据标准化,提高…

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统&#xff08;OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能&#xff09; 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…