【t012】整理书架
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】整理书架的更多相关文章
- C#基础整理
元旦整理书架发现一本小册子——<C#精髓>中国出版社2001年出版的,粗略翻了下关于C#的知识点挺全的虽然内容谈得很浅也有很多过时的内容(话说这本书是我在旧书店花5块钱淘的)我保留原有章节 ...
- 20180610模拟赛T3——书本整理
[问题描述] 小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱.小明把这个凌乱 ...
- 一些NSArray,NSDictionary,NSSet相关的算法知识
iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...
- [转]一些NSArray,NSDictionary,NSSet相关的算法知识
iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...
- 开始学习Scheme
开始学习Scheme 函数式编程(Functional Programming)是在MIT研究人工智能(Artificial Intelligence)时发明的,其编程语言为Lisp.确切地说,L ...
- C++ day01 预备知识、C++综述、教材、推荐阅读。
C++ day01: 1.预备知识? 1)什么是编程 编程,即编订程序. 程序 = 数据 + 算法(蛋糕 = 糖.鸡蛋.奶油 + 打鸡蛋.加糖.烤) 2)编程语言 最初的编程是用二进制代码(即“机器码 ...
- [转] Web前端开发工程师常用技术网站整理
1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...
- Web前端开发工程师常用技术网站整理
1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...
- 洛谷 P1103 书本整理(动规)
洛谷 P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发 ...
随机推荐
- GO语言学习(二十)Go 语言递归函数
Go 语言递归函数 递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recu ...
- android问题及其解决-优化listView卡顿和怎样禁用ListView的fling
问题解决-优化listView卡顿和怎样禁用ListView的fling 前戏非常长,转载请保留出处:http://blog.csdn.net/u012123160/article/details/4 ...
- Android之——图片的内存优化
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46972817 1. 对图片本身进行操作 尽量不要使用 setImageBitmap ...
- Day1:If else流程判断
一.if...else语句 if 条件成立: 执行条件成立后的代码 else: 执行条件不成立的代码 注:注意有冒号,python会强制缩进!一般语句都必须顶格写,缩进是缩进一个tab键,等于4个空格 ...
- HTTP详解--请求、响应、缓存
1. HTTP请求格式 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干.HTTP协议传输的消息 ...
- EularProject 41:最长的n位Pandigital素数问题
Pandigital prime Problem 41 We shall say that an n-digit number is pandigital if it makes use of all ...
- [D3] Create DOM Elements with D3 v4
Change is good, but creating from scratch is even better. This lesson shows you how to create DOM el ...
- IE block my cookie in iframe
---恢复内容开始--- There is a severe bug that a leader figured it out in a published project. In IE11, the ...
- Shiro的Web项目配置(转)
Shiro的Web项目配置 一 shiro的学习 二 shiro的java客户端配置 三 关于权限的一些问题 一 shiro的学习 官网和张开涛博客 二 shiro的java客户端配置 1.在web. ...
- HDU 1408 盐水的故事 数学水题
http://acm.hdu.edu.cn/showproblem.php?pid=1408 题目: 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下...,现 ...