洛谷:线性表

news2025/1/16 14:09:23

     今天开始刷洛谷,之前刷leetcode都是核心代码模式,现在突然让我用ACM模式,刚开始还是很不习惯的,但做了几道题好点了,只能说洛谷题的难度是比leetcode大的。

    还有就是,STL牛逼!

1.询问学号(vector)

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   vector<int>ret;
   int n,m,a,b;
   cin>>n>>m;
   while(n--)
  {
    cin>>a;
    ret.push_back(a);
  }
   while(m--)
  {
    cin>>b;
    cout<<ret[b-1]<<endl;
  }
 
}

       这道题还是比较简单的,首先我们要想用什么数据结构来存储数据,我们看到,要存储n名同学的学号,其次要询问第i个进入教室的同学的学号,什么数据结构能让我们在知道下标的情况下快速访问呢,那必然是数组啊,所以我先定义了一个动态变化的vector数组用来存储n名同学的学号,然后就是先获取学生个数和访问次数,然后输入这n名同学的学号,之后就是知道了下标b,直接输出ret[b-1]即可,还是很简单的。

2.寄包柜(map)

#include <iostream>
#include<map>
#include<cstdio>
using namespace std;
map <int, int> mat[100005];  
int main() {
	int n, q;
	scanf("%d%d", &n, &q);
	while (q--) {
		int x, i, j, k;
		scanf("%d", &x);
		if (x == 1) {
			scanf("%d%d%d", &i, &j, &k);  
			mat[i][j] = k;  
		} else {
			scanf("%d%d", &i, &j);
			printf("%d\n", mat[i][j]); 
		}
	} 
	return 0;
}

     这道题的核心是如何根据给出的第i个寄包柜来获取有多少格子,你肯定会首先想到用二维数组来做,但不好意思,你看看数量级,如果我们要访问第10^5寄包柜,好,我们开辟了这么多空间,前面的用不到啊,这不是在浪费空间还是在干什么?什么?你说vector容器,好家伙,vector容器的下标也是连续的啊,你访问第i个,前面的空间肯定也开辟出来了啊,本质还是数组。那就没有什么办法了?那肯定是没.......肯定有啊,想啥呢?

      我们使用map关联容器来做,map主要用来存储和检索集合中的数据元素,里面的数据均成一种映射关系,是一种包含关键字和值的键值对,关键字和值可以是字符串,数字等等,map里面的元素都是一个键值对,所以我们通过寄包柜和格子的映射关系来进行高效地存储和查找,当我们知道第i个寄包柜试,就通过map快速查找有多少个格子,这是离散并非连续的。

       所以我们定义一个map,第一个int是第几个柜子,第二个int是该柜子的格子数量,格子是有序的,当x=1时,我们就往第i个寄包柜的第j个格子里放物品;当x=2时,我们就输出第i个柜子的第j个格子的物品是什么。

3.验证栈序列(stack)

#include<iostream>
#include<stack>
using namespace std;
stack<int>stk;
int q,n;
int main()
{
  cin>>q;
  while(q--)
  {
	cin>>n;
	int a[n+1],b[n+1],cnt=1; 
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=n;i++)
	cin>>b[i]; 
	for(int i=1;i<=n;i++)
	{
		stk.push(a[i]);
		while((stk.top())==b[cnt])
		{
			stk.pop();
            cnt++;
			if(stk.empty())break;//这里也要注意,当我们已经比对完所有的元素时,假如都能比对上,则此时栈已经空了,如果我们还继续进行循环执行pop操作是会出错的,所以要对栈是否为空进行判断。
		}
	}
	if(stk.empty()) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
    while(!stk.empty())stk.pop();//如果前面栈不为空一定要清空栈再进入下一次循环
   }
	return 0; 
}

     这个题已经不能再明显了,肯定栈的题,我们先获取入栈序列和出栈序列,然后对栈进行入栈(push)操作,全部入栈完毕后,我们一个一个元素进行比较,如果相同,则将该栈元素弹出,cnt++,继续比较下一个,需要注意的点我在上面已经写了,栈为空时结束循环,此时也要进行判断,如果栈为空说明出栈序列是对的输出"Yes",否则输出"No",最后一定要把栈清空再进入下一次循环!

4.约瑟夫问题(queue)

#include<iostream>
#include<queue>
using namespace std;
int main()
{
  queue<int>q;
  int n,m;
  int num=1;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    q.push(i);
  }
   while(!q.empty())
  {
     if(num==m)
     {
       cout<<q.front()<<" ";
       q.pop();
       num=1;
     }
     else
     {
        num++;
        q.push(q.front());//队首的人压到队尾
        q.pop(); //删除队首的人 
      }
   }
   cout<<endl;
   return 0;
}

     这道题第一次在leetcode没做出来,在洛谷上用queue容器秒了。

     约瑟夫问题也是一个很经典的问题,n个人围成一个圈圈,给定一个数字k,从第一个人开始报数,数到k的人出圈,其他人依旧围成一个圈,同时出圈的人的下一个人从1开始报数,最后所有人都会出圈,我第一次想到循环队列,其实也可以用链表做,但个人认为循环队列超级简洁。

     首先定义一个队列,用num来记录编号到哪个人时num=m,然后就是向队列中插数,当队列不为空时,如果我的num不等于m的话,说明不是这个人,那我们就把队首的人压到队尾,同时删除队首的人,一直到num=m时,我们找到了第一个出局的人,把它输出并删除,同时令num=1,寻找下一个人。

5.机器翻译(queue)

#include<iostream>
#include<queue>
using namespace std; 
queue<int>q;
int m,n;
int cnt[1005]={0};//如果把数组放在主函数外,全部初始化为0,放在主函数内就是随机值,这时候就要初始化为0
int main()
{
  int ans=0;
  cin>>m>>n;
  int word;
  while(n--)
  {
    cin>>word;
    if(cnt[word])continue;
    else
    {
       if(q.size()>=m)
       { 
        cnt[q.front()]=0;//顺序不能调换,一旦调换就获取不到原来的队首元素了
        q.pop();
       }
        q.push(word);
        ans++;
        cnt[word]++;
    }
  }
    cout<<ans;
    return 0;
}

     这道题看前面的文字描述可能有点头皮发麻,直接看样例解释我们可以清楚这是一个在一端插入元素,在另一端删除元素的队列问题,需要注意的是,队列并没有count函数哦,我们需要用一个cnt数组来统计单词是否在字典中,输入单词,如果出现过就continue跳过,如果没有出现过,进一步判断队列是否已满,没满直接插入,ans++,cnt[word]++即可;如果已经满了,就先令队首元素在cnt数组的值为0,因为此时这个单词已经被删除了,查询结束返回ans即可。

    还有一点就是在定义数组的时候一定要定义在主函数外面啊,如果定义在主函数里面而且你不初始化,数组里面就全是随机值,因为这个卡了一些时间,定义在主函数外面就是全局变量,你自己忘了初始化,系统也会自动给你初始化为0的,但在主函数里面就不会,需要自己进行初始化。

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

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

相关文章

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

Python可视化之Matplotlib

文章目录 Matplotlib与可视化分析简单图形的绘制pylot的高级功能添加图例与注释 Matplotlib与可视化分析 我们之前对数据的处理与分析&#xff0c;其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 pip install matplotlib命令来安装对应的模块 简单图形的绘制…

《深入理解JAVA虚拟机笔记》Java 运行时内存区域

程序计数器&#xff08;线程私有&#xff09; 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看做是当前线程所执行的字节码的行号指示器。在 Java 虚拟机的概念模型里&#xff0c; 字节码解释器工作时就是通过改变这个计…

mfc140u.dll丢失的解决方法,怎样修复mfc140u.dll

最近看到很多朋友在问找不到mfc140u.dll丢失怎么办&#xff1f;有什么解决方法&#xff0c;今天就给小伙伴们解答一下&#xff0c;mfc140u.dll丢失的解决办法&#xff0c;怎么修复mfc140u.dll。 一.丢失的原因 1.损坏的程序安装:在安装某个程序时&#xff0c;可能会出现意外中…

【数据库】为什么要分库分表

为什么要分库分表 1.为什么要分库分表&#xff1f;2.垂直拆分3.水平拆分4.总结4.1 逻辑库和物理库4.2 逻辑表和物理表 1.为什么要分库分表&#xff1f; 随着近些年信息化大跃进&#xff0c;各行各业无纸化办公产生了大量的数据&#xff0c;而越来越多的数据存入了数据库中。当…

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成&#xff0c;每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义…

03-JWT令牌和普通令牌的区别,JWT令牌的格式和生成

JWT令牌 普通令牌问题 普通令牌的问题: 以OAuth2的密码模式为例进行说明,客户端每次访问资源时, 资源服务都需要远程请求认证服务去校验令牌的合法性导致执行性能低 如果能够让资源服务自己校验令牌的合法性&#xff0c;这样就可以省去远程请求认证服务的成本并提高性能 常见…

如何使用mac电脑,1、使用快捷命令打开访达,2、使用终端命令创建文件,3、使用命令打开创建的文件,并且在vscode中打开

如何使用mac电脑 1、使用快捷命令打开访达 optioncommand空格键 快速进入访达 shiftcmmandn 创建一个空目录 2、使用终端命令创建文件 2.1进入文件夹 在终端页面输入“cd /Users/yunf/Desktop/”并按回车键&#xff08;此时进入到桌面文件夹&#xff0c;如果需要进入到其它…

TCP 滑动窗口

滑动窗口&#xff08;Sliding window&#xff09;是一种流量控制技术。早期的网络通信中&#xff0c;通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况&#xff0c;同时发送数据&#xff0c;导致中间节点阻塞掉包&#xff0c;谁也发不了数据&#xff0…

19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验 文章目录 19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验1. 联合运算符Union Operators&#xff1a;合并 Python 字典的最优雅方式2. 类型提示Type Hints&#xff1a;使您的 Python 程序…

Linux高级管理——rsync远程同步

一、配置rsync源服务器&#xff1a; rsync (Remote Sync&#xff0c;远程同步&#xff09;是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0e;保持链接和权限&#xff0c;且采用优化的同步算法&#xff0e;传输前…

ChatGPT4.0(中文版)国内无限制免费版(附网址)

ChatGPT&#xff0c;由OpenAI开发的人工智能语言模型。它是你的数字对话伙伴&#xff0c;无论你有何问题或需要什么帮助&#xff0c;它都能提供有用的信息。 经过不断的研发和更新&#xff0c;ChatGPT的性能和功能得到了显著提升。现在&#xff0c;我们将重点介绍ChatGPT的两个…

Apache Commons Pool的对象池技术

第1章&#xff1a;引言 咱们今天来聊聊一个在Java开发中超级实用&#xff0c;但又经常被忽视的技术——对象池技术。可能你们已经听说过“对象池”这个名词&#xff0c;但对它的具体作用和重要性还有些模糊。别急&#xff0c;小黑带你们一步步深入了解。 想象一下&#xff0c…

《Linux系列》Linux磁盘MBR分区扩容

文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1&#xff09;参考阿里云扩容分区文档&#xff0c;整理MBR分区扩容 2&#xff09;本文档适用于MBR分区(fdisk -lu查…

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

Qt sender()函数

sender函数原型&#xff1a; QObject *sender() const; 如果在由信号激活的插槽中调用该函数&#xff0c;返回指向发送信号的对象的指针&#xff0c;否则返回0&#xff0c;该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。 主要代码如下&#xff1a; 其中运用了Q…

为什么设计制造行业需要数据加密?

设计制造行业是一个涉及多种技术、工艺、材料和产品的广泛领域&#xff0c;它对经济和社会的发展有着重要的影响。然而&#xff0c;随着数字化、智能化和网络化的发展&#xff0c;设计制造行业也面临着越来越多的数据安全风险&#xff0c;如数据泄露、数据篡改、数据窃取等。这…

sonarqube安装踩坑记录

如果用java1.8和mysql&#xff0c;则sonarqube版本不能超过7.8&#xff0c;看这里。 sonarqube7.8安装包地址&#xff1a; https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip 安装步骤&#xff1a; 1、下载sonarqube安装包 wget https://binari…

EduChat账号密码登录

内测申请&#xff1a;请邮件dan_yhstu.ecnu.edu.cn&#xff0c;以“EduChat内测申请单位”作为邮件标题&#xff0c;邮件内容中写明用途 先去申请个账号和密码&#xff0c;会有一两天延迟吧&#xff0c;挺快的。 拿到账号之后去官网,点一个 官网传送门 就出来用账号密码登录的…

C++ Qt开发:SqlTableModel映射组件应用

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlTableModule组件的常用方法及灵活运用。 …