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

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

看题:

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

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

cpp 复制代码
     #include <iostream>
        #include <cstring>
        #include <stdio.h>
        #include <algorithm>
        #include <stack>
        using namespace std;
        #define int long long
        int 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代码:

cpp 复制代码
#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");
	}
}
相关推荐
生成论实验室10 分钟前
自动驾驶:一个自主运动的系统
人工智能·算法·机器学习·语言模型·机器人·自动驾驶·安全架构
sheeta199812 分钟前
LeetCode 每日一题笔记 日期:2026.06.16 题目:3612. 字符串特殊符号处理
笔记·算法·leetcode
CoderYanger15 分钟前
A.每日一题:2095. 删除链表的中间节点
java·数据结构·程序人生·leetcode·链表·面试·职场和发展
青山木20 分钟前
Hot 100 --- 矩阵置零
线性代数·算法·leetcode·矩阵·哈希算法
Jasmine_llq21 分钟前
《B4264 [GESP202503 四级] 二阶矩阵》
线性代数·算法·矩阵·二维矩阵遍历枚举所有2×2矩阵·交叉乘积等式条件判断·输入输出快读加速·长整型防溢出计数统计
星恒随风24 分钟前
C++ string 类详解:常用接口、OJ 场景与模拟实现中的深浅拷贝
开发语言·c++·笔记·学习·状态模式
不知名的老吴37 分钟前
面经经验分享|算法和数据结构考察
数据结构·经验分享·算法
程序喵大人37 分钟前
【C++并发系列】第二章:锁解决了什么问题?
开发语言·c++·并发编程·
天天代码码天天37 分钟前
用 TensorRT 加速 PP-OCR:一套 C++ DLL + C# 调用的高性能 OCR 推理方案
c++·c#·ocr
叫我:松哥1 小时前
基于Python flask的中学可控智能命题系统设计与实现,整合遗传算法、DeepSeek 大模型及数据库技术构建一体化应用
数据库·人工智能·python·算法·机器学习·flask·遗传算法