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. [Ramda] Simple log function for debugging Compose function / Using R.tap for logging

    const log = function(x){ console.log(x); return x; } const get = R.curry(function(prop, obj){ return ...

  2. amazeui页面分析之登录页面

    amazeui页面分析之登录页面 一.总结 1.tpl命名空间:tpl命名空间的样式都是从app.css里面来的,app.css用用来移动网站开发的样式 2.表单样式:am-form到am-form- ...

  3. var let 区别

    var a = 5; var b = 10; if (a === 5) { let a = 4; // if 块级作用域 var b = 1; // 函数级作用域 console.log(a); // ...

  4. Surging Demo 项目之一

    原文:Surging Demo 项目之一 开发与运行环境 IDE Visual Stadio 2017/Visual Stadio 2019 Visual Stadio Core Docker 和 D ...

  5. js进阶 12-15 jquery如何实现点击button显示列表,点击其它位置隐藏列表

    js进阶 12-15 jquery如何实现点击button显示列表,点击其它位置隐藏列表 一.总结 一句话总结:在button中阻止事件冒泡. 1.如何咋button中阻止事件冒泡(两种方法)? ev ...

  6. HDU 1212 Big Number 大数模小数

    http://acm.hdu.edu.cn/showproblem.php?pid=1212 题目大意: 给你一个长度不超过1000的大数A,还有一个不超过100000的B,让你快速求A % B. 什 ...

  7. SQLite header and source version mismatch解决方案

    SQLite header and source version mismatch 最近需要用到sqlite,去官网下了一个编译安装后打开sqlite3出现SQLite header and sour ...

  8. Ubuntu12.04.4 Vmware 虚拟机安装总结

    Ubuntu12.04.4 Vmware 虚拟机安装总结 背景:近期准备入手一块树莓派(RaspberryPI),准备一下开发环境,可惜机器硬盘小,又舍不得格调Win7,所以仅仅好装虚拟机了.考虑到对 ...

  9. [Jade] Use Mixins in Pug

    Mixin works as a function. extends layout include mixins/storeForm block content .inner h2 #{title} ...

  10. thinkphp3.2.3 自动验证 正则验证

    <?php namespace Home1\Model; use Think\Model; class ShopYuyueInfoModel extends Model { // protect ...