Time Limit: 1 second

Memory Limit: 32 MB

【问题描述】

小明是一个非常喜欢读书的孩子,他有一个特别的书架,书架上摆放着他买的新书。当他决定要阅读某本图书时,他就把书从书架中取出,这时书架上就出现了空位,他会立即整理这些图书使图书之间不出现空位。小明总是将新书从左边塞入,由于书架的宽度是有限的,新加入的书可能把书架上另一端的图书挤出来。
小明的记忆力不好,他需要你的帮助,给你一系列的操作,请你计算出书架上摆放有几本图书,并把它们的编号按照从左到右的顺序输出。一共有三种操作:
添加操作A id w:从书架的左边塞入一本编号为id的图书,该图书的宽度为w,并向右推以确保该图书摆放在书架上。如果书架上图书的总宽度超过书架的宽度,那么不完全在书架内的图书将会从书架上掉下来。任何一本书的宽度都不会超过书架的宽度。如果编号为id的图书已经在书架上,则该操作无效。
删除操作R id:从书架上拿走一本编号为id的图书。如果编号为id的图书不在书架上,则该操作无效。
结束操作E:操作结束。

【输入格式】

输入数据的第一行是一个整数N(1≤N≤100,000),表示书架的宽度。紧接着是一系列的操作,添加操作的格式如下:
A id w 其中id是图书的编号,w是图书的宽度,id和w均为整数(0<id≤100,000,0<w≤N)。
删除操作的格式如下:
R id
其中id为图书的编号,id为整数(0<id≤100,000)。
字符‘E’表示操作结束。
需要注意的是,从书架上拿下编号为id的图书后再放一本编号为id的图书,它们的宽度可能不同。操作数不会超过200,000。

【输出格式】

输出一个整数S表示书架上图书的数量,接下来一行按照从左到右的顺序输出书架上图书的编号(编号之间有一个空格,最后一个编号后不需要空格)。

【输入样例1】

5
A 1 1
A 2 1
A 3 1
R 2
A 2 2
A 5 1
R 5
R 4
A 6 1
A 7 4
E

【输出样例1】

2
7 6

【输入样例2】

5
E

【输出样例2】

0

【输入样例3】

3
A 1 2
A 2 1
R 3
A 2 3
E

【输出样例3】

2
2 1

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t012

【题意】

【题解】

/*
用链表来模拟这个过程;
一个计数器sum记录总的长度;
先把新的书加进去;
然后看看总长度有没有大于N;
大于N了
就在链表的尾端将最末端的书给去除掉;
一开始可以先加两个哨兵节点(最左和最右,方便插入和查找最末的位置);
删除的时候就是链表节点的删除;然后减掉那本数的宽度;
修改那本书是否在链表中;
看看sum是否还大于N,还大于N的话就重复上述操作。
*/

【完整代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e5+100; struct point
{
int w,id;
point *next,*pre;
}; struct abc
{
int in;
point *wh;
}; int n,num=0;
int now;//总长度可能爆int
char s[5];
point *h, *t,*p;
abc a[N]; void in()
{
rei(n);
h = new point, t = new point;
h->next = t;
t->pre = h;
} void cl()
{
scanf("%s", s);
while (s[0] != 'E')
{
int id, w;
if (s[0] == 'A')
{
rei(id), rei(w);
if (!a[id].in)
{
a[id].in = 1;
num++;
now += w;
p = new point;
p->w = w, p->id = id;
h->next->pre = p;
p->next = h->next;
h->next = p;
p->pre = h;
a[id].wh = p;
while (now > n)
{
p = t->pre;
a[p->id].in = 0;
now -= p->w;
p->pre->next = t;
t->pre = p->pre;
num--;
}
}
}
else
{
rei(id);
if (a[id].in)
{
a[id].in = 0;
num--;
p = a[id].wh;
p->pre->next = p->next;
p->next->pre = p->pre;
now -= p->w;
}
}
scanf("%s", s);
}
} void o()
{
printf("%d\n", num);
p = h->next;
int cnt = 0;
while (p != t)
{
printf("%d", p->id);
cnt++;
if (cnt == num)
puts("");
else
putchar(' ');
p = p->next;
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
in();
cl();
o();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【t012】整理书架的更多相关文章

  1. C#基础整理

    元旦整理书架发现一本小册子——<C#精髓>中国出版社2001年出版的,粗略翻了下关于C#的知识点挺全的虽然内容谈得很浅也有很多过时的内容(话说这本书是我在旧书店花5块钱淘的)我保留原有章节 ...

  2. 20180610模拟赛T3——书本整理

    [问题描述] 小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱.小明把这个凌乱 ...

  3. 一些NSArray,NSDictionary,NSSet相关的算法知识

    iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...

  4. [转]一些NSArray,NSDictionary,NSSet相关的算法知识

    iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...

  5. 开始学习Scheme

    开始学习Scheme   函数式编程(Functional Programming)是在MIT研究人工智能(Artificial Intelligence)时发明的,其编程语言为Lisp.确切地说,L ...

  6. C++ day01 预备知识、C++综述、教材、推荐阅读。

    C++ day01: 1.预备知识? 1)什么是编程 编程,即编订程序. 程序 = 数据 + 算法(蛋糕 = 糖.鸡蛋.奶油 + 打鸡蛋.加糖.烤) 2)编程语言 最初的编程是用二进制代码(即“机器码 ...

  7. [转] Web前端开发工程师常用技术网站整理

    1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...

  8. Web前端开发工程师常用技术网站整理

    1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...

  9. 洛谷 P1103 书本整理(动规)

    洛谷 P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发 ...

随机推荐

  1. Photon + Unity3D 线上游戏开发 学习笔记(三)

    好的,说了两篇了 如今我们正式的入手,揭开photon 的盖头哈  建立photon项目 第一步:   在Visual studio建立一个空的 待会为了測试也会在里面建立一个client 项目 (只 ...

  2. 关于pcb铺铜

  3. 单位转换 inch mm mil

    从上面看:英寸(inch)是最大的单位   其次是毫米(mm)  再次是密耳(mil)

  4. 【Codeforces Round #433 (Div. 1) C】Boredom(树状数组)

    [链接]h在这里写链接 [题意] 给你一个n*n的矩阵. 其中每一列都有一个点. 任意两个点构成了矩形的两个对角点 ->即任意两个点确定了一个矩形. ->总共能确定n*(n-1)/2个矩形 ...

  5. 【CS Round #48 (Div. 2 only)】8 Divisible

    [链接]h在这里写链接 [题意] 给你一个长度为n的数字(n<=1000) 然后让你任意组合这个数字. 使得这个数字能被8整除. (不能出现前导0) [题解] 只要后三位能被8整除就可以了. 则 ...

  6. Java BlockingQueue Example(如何使用阻塞队列实现生产者-消费者问题)

    Today we will look into Java BlockingQueue. java.util.concurrent.BlockingQueue is a java Queue that ...

  7. SVN—怎样安装SVNclient软件

            一.怎样安装TortoiseSVN-1.7.12.24070-win32-svn-1.7.9版本号的SVNclient软件:        a.下载TortoiseSVN-1.7.12 ...

  8. Intel X86 CPU 系列的寻址方式

    Intel X86 CPU 系列的寻址方式 数据总线和地址总线要尽量相同,这个是一个地址就是一个指针.

  9. 7.1 基础知识Android消息处理机制

    1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程 ...

  10. 高级Java工程师必备 ----- 深入分析 Java IO (三)

    概述 Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO( ...