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 ...
随机推荐
- SQL 初级教程学习(二)
1.SQL 语句从 "Websites" 表中选取头两条记录: SELECT * FROM Websites LIMIT 2; SELECT TOP 50 PERCENT * FR ...
- Qt下存储读写应用程序设置的三种方法
一.简介 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小.位置和密码等等.有三种方法可以实现: 使用注册表: 使用配置文件(.ini): 使用自定义文件(例如.txt) ...
- sqlserver事务隔离
事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动.我们可以显式或隐式的定义事务边界.可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始.如果 ...
- 自定义View(11)**在onDraw中使用矩阵Matrix
1.代码示例 1.1 效果 原图 : 其尺寸为162 x 251,示例中的红点是变形的锚点. 变形之后: 1.2 代码 package com.e.weixin.session.view; impor ...
- electron打包整理
最近在折腾把项目打包成桌面应用程序,发现一个工具electron,可以讲项目打包成一个跨平台的应用程序,很方便,来学习一下. 1.先安装electron.electron-packager,安装方法可 ...
- 472 Concatenated Words 连接的单词
详见:https://leetcode.com/problems/concatenated-words/description/ C++: class Solution { public: vecto ...
- Linux终端下对话
1.首先查看当前账户 [hadoop@weekend01 ~]$ who hadoop tty1 2016-11-14 09:31 (:0) hadoop pts/0 ...
- android开发学习——关于activity 和 fragment在toolbar上设置menu菜单
在做一个项目,用的是Android Studio 系统的抽屉源码,但是随着页面的跳转,toolbar的title需要改变,toolbar上的menu菜单也需要改变,在网上找了好久,也尝试了很多,推荐给 ...
- NSoup获取网页源代码
NSoup是JSoup的Net移植版本.使用方法基本一致. 如果项目涉及HTML的处理,强烈推荐NSoup,毕竟字符串截断太苦逼了. 下载地址:http://nsoup.codeplex.com/ # ...
- iOS开发 - CoreData框架 数据持久化
Core Data Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还 ...