Borrowers
Description
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shelves, and creators of odd volumes.
- (Charles Lamb, Essays of Elia (1823) `The Two Races of Men')
Like Mr. Lamb, librarians have their problems with borrowers too. People don't put books back where they should. Instead, returned books are kept at the main desk until a librarian is free to replace them in the right places on the shelves. Even for librarians, putting the right book in the right place can be very time-consuming. But since many libraries are now computerized, you can write a program to help.
When a borrower takes out or returns a book, the computer keeps a record of the title. Periodically, the librarians will ask your program for a list of books that have been returned so the books can be returned to their correct places on the shelves. Before they are returned to the shelves, the returned books are sorted by author and then title using the ASCII collating sequence. Your program should output the list of returned books in the same order as they should appear on the shelves. For each book, your program should tell the librarian which book (including those previously shelved) is already on the shelf before which the returned book should go.
Input
First, the stock of the library will be listed, one book per line, in no particular order. Initially, they are all on the shelves. No two books have the same title. The format of each line will be:
``title" byauthor
The end of the stock listing will be marked by a line containing only the word:
END
Following the stock list will be a series of records of books borrowed and returned, and requests from librarians for assistance in restocking the shelves. Each record will appear on a single line, in one of the following formats:
BORROW ``title"
RETURN ``title"
SHELVE
The list will be terminated by a line containing only the word:
END
Output
Each time the SHELVE command appears, your program should output a series of instructions for the librarian, one per line, in the format:
Put `` " after ``
"
or, for the special case of the book being the first in the collection:
Put ``title" first
After the set of instructions for each SHELVE, output a line containing only the word:
END
Assumptions & Limitations:
1. A title is at most 80 characters long.
2. An author is at most 80 characters long.
3. A title will not contain the double quote (") character.
Sample Input
"The Canterbury Tales" by Chaucer, G.
"Algorithms" by Sedgewick, R.
"The C Programming Language" by Kernighan, B. and Ritchie, D.
END
BORROW "Algorithms"
BORROW "The C Programming Language"
RETURN "Algorithms"
RETURN "The C Programming Language"
SHELVE
END
Sample Output
Put "The C Programming Language" after "The Canterbury Tales"
Put "Algorithms" after "The C Programming Language"
END 这道题完全是借鉴别人博客上的,不过当时没有理解深刻,所以犯了几个小错误
WA代码:
#include"iostream"
#include"cstring"
#include"sstream"
#include"set"
#include"map"
using namespace std; struct node{
string name,author;
friend bool operator <(node a,node b){
if(a.author==b.author)
return a.name<b.name;
else
return a.author<b.author;
}
}; set<node> p; //存放书架上原有书籍
set<node> q; //存放借阅和归还信息
map<string,string> mp; string fun(string c)
{
for(int i=0;i<c.size();i++)
{
if(c[i]=='\"') c[i]=' ';
}
string cc,rev;
stringstream ss(c);
int f=0;
while(ss>>cc)
{
if(f++) rev+=' ';
rev+=cc;
}
return rev;
} void deal(string temp) //存好书架上的信息
{
for(int i=0;i<temp.size();i++)
{
if(temp[i]=='\"') temp[i]=' ';
}
stringstream ss(temp);
string s;
int flag=0,f=0;
node e;
while(ss>>s)
{
if(s=="by")
{
flag=1;
}
if(flag!=1)
{
if(f++) e.name+=' ';
e.name+=s;
}
if(flag==1)
{
if(f++) e.author+=' ';
e.author+=s;
}
}
p.insert(e);
mp[e.name]=e.author;
} int main()
{
string temp;
while(getline(cin,temp))
{
if(temp=="END") break;
deal(temp);
}
string cc;
while(cin>>cc)
{
if(cc=="END") break;
if(cc=="SHELVE")
{
while(!q.empty())
{
node ee=*q.begin();
q.erase(ee);
set<node>::iterator it;
// for(it=p.begin();it!=p.end();++it) cout<<*it.name<<endl;
it=p.lower_bound(ee);
if(it==p.begin()) cout<<"Put \""<<ee.name<<"\" first"<<endl;
else
{
if(it==p.end()) it--; //这里出错,lower_bound()函数是返回一个大于等于value的值的位置,无论如何,it都应该--
cout<<"Put \""<<ee.name<<"\" after \""<<(*it).name<<'\"'<<endl;
p.insert(ee); //这一句位置出错,不管书架上原先有没有书,都应该插入新还的书
}
}
}
else
{
string c;
getline(cin,c);
c=fun(c);
node nn;
nn.name=c;
// cout<<c<<endl;
nn.author=mp[c];
// cout<<mp[c]<<endl;
if(cc=="BORROW") p.erase(nn); //从书架上拿书
if(cc=="RETURN") q.insert(nn); //待处理的书
}
}
return 0;
} AC代码:
#include"iostream"
#include"cstring"
#include"sstream"
#include"set"
#include"map"
using namespace std; struct node{
string name,author;
friend bool operator <(node a,node b){
if(a.author==b.author)
return a.name<b.name;
else
return a.author<b.author;
}
}; set<node> p; //存放书架上原有书籍
set<node> q; //存放借阅和归还信息
map<string,string> mp; string fun(string c)
{
for(int i=0;i<c.size();i++)
{
if(c[i]=='\"') c[i]=' ';
}
string cc,rev;
stringstream ss(c);
int f=0;
while(ss>>cc)
{
if(f++) rev+=' ';
rev+=cc;
}
return rev;
} void deal(string temp) //存好书架上的信息
{
for(int i=0;i<temp.size();i++)
{
if(temp[i]=='\"') temp[i]=' ';
}
stringstream ss(temp);
string s;
int flag=0,f=0;
node e;
while(ss>>s)
{
if(s=="by")
{
flag=1;
}
if(flag!=1)
{
if(f++) e.name+=' ';
e.name+=s;
}
if(flag==1)
{
if(f++) e.author+=' ';
e.author+=s;
}
}
p.insert(e);
mp[e.name]=e.author;
} int main()
{
string temp;
while(getline(cin,temp))
{
if(temp=="END") break;
deal(temp);
}
string cc;
while(cin>>cc)
{
if(cc=="END") break;
if(cc=="SHELVE")
{
while(!q.empty())
{
node ee=*q.begin();
q.erase(ee);
set<node>::iterator it;
// for(it=p.begin();it!=p.end();++it) cout<<*it.name<<endl;
it=p.lower_bound(ee);
if(it==p.begin()) cout<<"Put \""<<ee.name<<"\" first"<<endl;
else
{
it--;
cout<<"Put \""<<ee.name<<"\" after \""<<(*it).name<<'\"'<<endl; } p.insert(ee);
}
cout<<"END"<<endl; }
else
{
string c;
getline(cin,c);
c=fun(c);
node nn;
nn.name=c;
// cout<<c<<endl;
nn.author=mp[c];
// cout<<mp[c]<<endl;
if(cc=="BORROW") p.erase(nn); //从书架上拿书
if(cc=="RETURN") q.insert(nn); //待处理的书
}
}
return 0;
}
Borrowers的更多相关文章
- uva 230 Borrowers(摘)<vector>"结构体“ 膜拜!
I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves ...
- UVa230 Borrowers (STL)
Borrowers I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...
- [刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers
//又开学啦,不知不觉成为大二的老人了...时间过得好快啊,感觉好颓废... 题意:建立一个借书/归还系统.有借.还.把还的书插到书架上这三个指令. 代码:(Accepted, 0ms) //UVa2 ...
- UVa 230 Borrowers(map和set)
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shelve ...
- Borrowers UVA - 230
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...
- UVa230 Borrowers
原题链接 UVa230 思路 这题输入时有一些字符串处理操作,可以利用string的substr()函数和find_last_of()函数更加方便,处理时不必更要把书名和作者对应下来,注意到原题书名的 ...
- Uva - 230 - Borrowers
AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cctype ...
- UVA 230 Borrowers (STL 行读入的处理 重载小于号)
题意: 输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE. BORROW 和 RETURN 都会带有一个书名在后面,如: ...
- 【习题 5-8 UVA - 230】Borrowers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map+set写个模拟就好. 3个区域 书架.桌子.别人的手上. 其中前两个区域的书都能借出去. [代码] #include &l ...
随机推荐
- Docker+Jenkins+Git发布SpringBoot应用
Doccker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之 ...
- redis问题集结
redis和memcached比较? redis中数据库默认是多少个db 及作用? python操作redis的模块? 如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值? redi ...
- [Usaco2008 Dec]Patting Heads 轻拍牛头
Description 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号 ...
- 人工智能-深度学习(2)TensorFlow安装及基本使用(学习笔记)
一.TensorFlow 简介 TensorFlow 是 Google 开源的一款人工智能学习系统.为什么叫这个名字呢? Tensor 的意思是张量,代表 N 维数组:Flow 的意思是流,代表基于数 ...
- suricata.yaml (一款高性能的网络IDS、IPS和网络安全监控引擎)默认配置文件(图文详解)
不多说,直接上干货! 前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 或者 基于Ubuntu14.04下Suric ...
- node入门(二)——gulpfile.js初探
本文关于gulpfile.js怎么写,利于完成个性化需求.本文开发环境默认已安装node,详情参考<node入门(一)——安装>. 一.安装gulp npm install -g gulp ...
- SpringBoot_自定义配置属性
@ConfigurationProperties 在aplication.properties 中添加如下一段配置: mysql.jdbcName=com.mysql.jdbc.Driver mysq ...
- git + git flow 的简单介绍
1.git简单实用 git:是一种分布式版本控制系统,因为其优秀的特性个人十分推崇. 1.1设置本机用户身份 git config -global user.name "userName&q ...
- MYSQL 查询方法 统计查询 链接查询 子查询
mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...
- Node.js——render封装
封装 挂在到res上