当前位置: 首页 > news >正文

P1160 队列安排

题目描述

一个学校里老师要将班上 N 个同学排成一列,同学被编号为 1∼N,他采取如下的方法:

  1. 先将 1 号同学安排进队列,这时队列中只有他一个人;

  2. 2∼N 号同学依次入列,编号为 i 的同学入列方式为:老师指定编号为 i 的同学站在编号为 1∼(i−1) 中某位同学(即之前已经入列的同学)的左边或右边;

  3. 从队列中去掉 M 个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

输入格式

第一行一个整数N,表示了有 N 个同学。

第 2∼N 行,第 i 行包含两个整数 k,p,其中 k 为小于 i 的正整数,p 为 0 或者 1。若 p 为 0,则表示将 i 号同学插入到 k 号同学的左边,p 为 1 则表示插入到右边。

第 N+1 行为一个整数 M,表示去掉的同学数目。

接下来 M 行,每行一个正整数 x,表示将x 号同学从队列中移去,如果x 号同学已经不在队列中则忽略这一条指令。

输出格式

一行,包含最多 N 个空格隔开的整数,表示了队列从左到右所有同学的编号。

输入输出样例

输入 #1复制

4
1 0
2 1
1 0
2
3
3

输出 #1复制

2 4 1

思路:

1.考虑到这是一道模拟题,那我们需要模拟的部分就是

                                ↓

        如何放入一个插队者,并让他尽快融入队列

①考虑到可以创建一个add函数

    →执行将插队者插入右边,即p==1

    →执行将插入者插入左边,即p==0

2.整体函数内容出来后,我们考虑如何执行它

                               ↓

            考虑链表加结构体

②结构体的创建我就不详细说了

③那链表要如何使用?

   →当我们把队列想成一个人和人手拉手的圈,那么每个人就要有左右手,即l,r

   →当一个人被踢出圈中时,就要标记为不输出

struct node
{int l,r;        int d;        
};
node t[100005];

   →右:这个数的右手牵着原数右手边原来的数

              这个数的左手牵着原数

              原数的右手牵着这个数

              原数右手边原来的数的左手牵着这个数

if(p==1){t[i].r=t[k].r;t[i].l=k; t[k].r=i;t[t[i].r].l=i;
}

    →左:这个数的左手牵着原数左边原来的那个数

               这个数的右手牵着原数

               原数的左手牵着这个数

               原数左边原来的那个数的右手牵着这个数

else{t[i].l=t[k].l;t[i].r=k;t[k].l=i;t[t[i].l].r=i;
}

那么我们用什么方法确定是否输出呢

                        ↓

             及更改d的值

④遍历所有数,找到被踢出圈的人,不输出,即d标为1

cin>>m;
while(m--){cin>>x;t[x].d=1;        
}

⑤输出从左到右所有同学的编号

   →通过找右手牵着的人遍历

for(int i=t[0].r;i;i=t[i].r){if (t[i].d==0)   cout<<i<<" ";
}

代码:

 

#include <bits/stdc++.h>
using namespace std;
int n,m;
struct node
{int l,r;int d;
};
node t[100005];
void add(int k,int i,int p)
{if(p==1){t[i].r=t[k].r;t[i].l=k;t[k].r=i;t[t[i].r].l=i;}else{t[i].l=t[k].l;t[i].r=k;t[k].l=i;t[t[i].l].r=i;}
}
int main()
{int x,k,p;cin>>n;t[0].r=0,t[0].l=0;add(0,1,1);for (int i=2;i<=n;i++){cin>>k>>p;add(k,i,p);}cin>>m;while(m--){cin>>x;t[x].d=1;}for(int i=t[0].r;i;i=t[i].r){if(t[i].d==0)cout<<i<<" ";}return 0;
}

 

 

 

 

 

 

相关文章:

  • Excel插入多行VBA实现
  • 【Real】[Flask]SSTI
  • 2024年,企业人才招聘怎么做?
  • B站pink老师HTML5基础(一)
  • SAP OBYC自动记账 详解
  • LangChain笔记
  • makefile一些特殊且常用的符号
  • 哈希算法教程(个人总结版)
  • 查询DQL
  • 赶紧收藏!2024 年最常见 20道 Rocket MQ面试题(二)
  • 基于python flask +pyecharts实现的气象数据可视化分析大屏
  • NDIS小端口驱动开发(一)
  • K210 数字识别 笔记
  • 通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求
  • 新建一个esri_sde_gists的服务
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [数据结构]链表的实现在PHP中
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • angular学习第一篇-----环境搭建
  • CSS3 变换
  • Javascript Math对象和Date对象常用方法详解
  • Java精华积累:初学者都应该搞懂的问题
  • Linux快速复制或删除大量小文件
  • nodejs调试方法
  • Sublime text 3 3103 注册码
  • 多线程事务回滚
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 智能合约Solidity教程-事件和日志(一)
  • gunicorn工作原理
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​520就是要宠粉,你的心头书我买单
  • # Maven错误Error executing Maven
  • #控制台大学课堂点名问题_课堂随机点名
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (LeetCode C++)盛最多水的容器
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (初研) Sentence-embedding fine-tune notebook
  • (二)windows配置JDK环境
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (剑指Offer)面试题34:丑数
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (译) 函数式 JS #1:简介
  • (原創) 未来三学期想要修的课 (日記)
  • (转)ORM
  • (转)大型网站架构演变和知识体系
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • 、写入Shellcode到注册表上线
  • .Mobi域名介绍
  • .Net 6.0--通用帮助类--FileHelper