数据结构 hbb(汉堡包)

问题描述

  汉堡包有收集汉犇犇的癖好,它喜欢把汉犇犇一个叠一个的放置。
  因为它有强迫症,所以每当它想放一个新的汉犇犇进去的时候并不一定想直
接叠在最上面,简单的说,当他想放第 A 个新的汉犇犇的时候,他想把它插入到
汉犇犇 Ai(保证汉犇犇 Ai 存在)的上面;
  除此之外,有时候他会吃掉收集的部分汉堡包,因为不满足于只吃一个,每
次会吃掉某个汉犇犇开始,往上连续的 x(x>=1)个汉犇犇。
  给定 n 个操作,输出 n 个操作后活下来的汉犇犇的编号(从最底下的汉犇犇
开始到最顶):

1 a    : 1 代表一个新的汉犇犇(第一个出现的汉犇犇编号为 1,第二个为 2,以此类推),汉堡包想把他放在编号为 a 的汉犇犇上面,如果不存在编号 a的汉犇犇,则放在所有汉犇犇的最上面即可;

2 a b : 2 代表汉堡包想吃掉编号 a 的汉犇犇开始(如果 a 不存在则从最底下的汉堡包开始),按叠好的顺序,往上共计 b 个汉犇犇(算上编起始位置一共 b 个),若不够 b 个,则吃到顶结束;

★数据输入
输入第一行为一个正整数 n,代表操作数量。
接下来 n 行操作,如题意;
对于 50%的数据, 1<=n<=1000;
对于 100%的数据, 1<=n<=100000, 0 <= a, b <= 100000
★数据输出
输出自底向上的汉犇犇编号,数字之间用空格隔开,行末无空格,无换行;
输入示例 输出示例
3
1 10
1 10
1 1
1 3 2
输入示例 输出示例
4
1 10
1 10
1 1
2 1 2
2

示例一解释:
(1) 第一个操作,加入汉犇犇 1 放在汉堡包 10 上面,汉堡包 10 不存在,所以直
接放最上{ 1 }
(2) 第二个操作,加入汉犇犇 2 放在汉犇犇 10 上面,汉犇犇 10 不存在,所以
直接放最上{ 1, 2}
(3) 第三个操作,加入汉犇犇 3 放在汉犇犇 1 上面,汉犇犇 1 存在,所以放 1
上{ 1, 3, 2}

示例二解释:
(1) 前面部分操作和示例一一样,为 {1, 3, 2};
(2) 接着汉堡包吃掉汉犇犇 1 是的 2 个汉犇犇,所以{1, 3}被吃掉
(3) 故输出 2

解题思路

  双向链表+数组存对应节点的地址

code(未验证)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <iostream>
  4 using namespace std;
  5 #include <string.h>
  6
  7 #define MAXN 100002
  8
  9 struct Node
 10 {
 11     Node(int _data)
 12         :data(_data),bef(NULL),next(NULL){}
 13     int data;
 14     Node *bef;//before
 15     Node *next;
 16 };
 17
 18 Node *addr[MAXN] = {0};
 19 Node *head = NULL, *tail = NULL;
 20
 21 void Init();
 22 void Insert(int &prenum,int &thisnum);
 23 void Eat(int &start,int &num);
 24 void DisAll();
 25
 26 int main()
 27 {
 28     Init();
 29     DisAll();
 30
 31     return 0;
 32 }
 33
 34 void Init()
 35 {
 36     int i=0,j=0;
 37     int opnum=0,op=0,hbbnum=1;
 38     int a=0,b=0;
 39
 40     scanf("%d",&opnum);
 41     head = new Node(-1);
 42     tail = head;
 43
 44     for(i=1;i<=opnum;i++)
 45     {
 46         scanf("%d",&op);
 47         if(op==1)
 48         {
 49             scanf("%d",&a);
 50             Insert(a,hbbnum);
 51             ++hbbnum;
 52         }
 53         else//op==2
 54         {
 55             scanf("%d %d",&a,&b);
 56             Eat(a,b);
 57         }
 58 //        DisAll();
 59     }
 60 }
 61
 62 void Insert(int &prenum,int &thisnum)
 63 {
 64     Node *pnew = new Node(thisnum);
 65     if(addr[prenum] && addr[prenum]->next)//要找的数存在 且 不是最后一个
 66     {
 67         addr[thisnum] = pnew;
 68         pnew->next = addr[prenum]->next;
 69         addr[prenum]->next->bef = pnew;
 70         pnew->bef = addr[prenum];
 71         addr[prenum]->next = pnew;
 72     }
 73     else//数不存在 或 数是最后一个
 74     {
 75         addr[thisnum] = pnew;
 76         pnew->bef = tail;
 77         tail->next = pnew;
 78         tail = pnew;
 79     }
 80 }
 81
 82 void Eat(int &start,int &num)
 83 {
 84     int i;
 85     Node *p;
 86     if(addr[start]==NULL)//要找的数不存在,从头开始删
 87     {
 88         for(i=1, p=head->next; p && i<=num; i++, p=p->next)
 89         {
 90             addr[p->data] = NULL;
 91         }
 92         head->next = p;
 93         if(p==NULL) tail = head;
 94         else        p->bef = head;
 95     }
 96     else//找的数存在,获取地址,开始删
 97     {
 98         Node *pl = addr[start]->bef;
 99         for(i=1, p=addr[start]; p && i<=num; i++, p=p->next)
100         {
101             addr[p->data] = NULL;
102         }
103         pl->next = p;
104         if(p==NULL) tail = pl;
105         else         p->bef = pl;
106     }
107 }
108
109 void DisAll()
110 {
111     for(Node *p = head->next; p; p=p->next)
112     {
113         if(p==head->next)
114             printf("%d",p->data);
115         else
116             printf(" %d",p->data);
117     }
118 }

转载于:https://www.cnblogs.com/cbattle/p/7577649.html

数据结构 hbb(汉堡包)相关推荐

  1. 程序员到底为什么要掌握数据结构与算法?

    周末了,闲聊几句. 当代程序员,也就是我们,其实是非常幸运的,为什么?因为前人,也就是那些大牛已经为你铺好路了. 大牛铺路导致的后果就是整个计算机系统像这个汉堡包一样是分层的: 越是上层越抽象,用起来 ...

  2. 3D特征:关于HFM和HBB

    1.HBB    三维绑定框 (1): 要用到HBB,定义还不太清楚,来自于 VALVE Developer Community (https://developer.valvesoftware.co ...

  3. 数据结构(08)— 线性单链表基本操作

    1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...

  4. 数据结构(06)— 线性循环链表实战

    1. 循环链表定义 单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是"空".这样, 由表尾很容易找到表头. 但若 ...

  5. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  6. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  7. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  8. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

  9. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

    1. Vec 对象类型 Vec 是一个主要用于数值向量的模板类.我们可以定义向量的类型和组件的数量: Vec<double, 19> myVector 我们还可以使用任何的预定义类型: t ...

  10. 数据结构与算法——线性结构——线性表及其表示

    -"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...

最新文章

  1. 从零开始学_JavaScript_系列(24)——查看对象属性,合并数组
  2. Oracle10g补丁怎么安装,在CentOS6.4上安装oracle10g需要的补丁
  3. java方法的参数_Java方法参数
  4. MFC(WTL)编辑框长度限制
  5. Linux time()函数解析
  6. 作者:江荣(1984-),男,博士,国防科学技术大学助理研究员。
  7. 读书笔记—《销售铁军》随记3
  8. LeetCode从读题到自闭:204. 计数质数
  9. Unity NGUI 网络斗地主 -界面制作
  10. linux pandas教程_Python Anaconda教程–了解最受欢迎的数据科学平台
  11. 信息安全等级保护 实施方案
  12. Catalan Number(卡特兰数/卡塔兰数)
  13. 壮观性能服务器图片介绍,配至强7500 图解惠普ProLiant DL980 G7
  14. oracle容灾是什么意思,谈谈容灾
  15. 查看网页是否压缩gzip+编码方式
  16. 架构设计(7)—如何设计一个架构
  17. 前端年后面试真题,会80%直接进大厂
  18. NTLDR是做什么的,丢失了如何恢复
  19. 站长SEO超级外链工具_V1.1
  20. DataDig 5.0.0::自动提取论文图表中曲线数据的软件

热门文章

  1. 朱光潜给青年的十二封信 之 谈升学和选课
  2. 动荡市场的利剑——“统计套利”
  3. 深度学习要多深,才能读懂人话?|阿里小蜜前沿探索
  4. 金融知识小科普 - 金融杠杆
  5. matlab c2d的c语言实现,Matlab c2d()函数的用法
  6. 苏宁API:item_get - 获得suning商品详情
  7. multisim异或门
  8. 一台电脑安装两个jdk的方法
  9. 强化学习 原理与Python实现(四)
  10. Python爬虫实训案例之爬取豆瓣电影Top250并保存至excel