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 ...
随机推荐
- 【Android跨进程】IPC总结
前言 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.两个进程可以是两个独立的app也可以是一个app的两个 ...
- Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】
期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目 ...
- 原生JavaScript之深度克隆
先看一下克隆成功后的结果 深度克隆就是将obj的属性克隆到obj1上面,并且在obj上面修改属性不影响obj1上面的属性. 1.先把所有的值都遍历一遍(看是引用值和原始值)用for ( var pro ...
- Canvas 入门案例
五. Canvas 入门案例 1. canvas 圆形绘制 <!DOCTYPE html> <html lang="en"> <head> ...
- JAVA启动参数三:非Stable参数
前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了:但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX: ...
- BZOJ2333 棘手的操作
Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x ...
- CalService
package org.crazyit.cal; import java.math.BigDecimal; /** * 计算业务类 * * @author yangenxiong yangenxion ...
- 开发一个 Web App 必须了解的那些事
在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...
- kafaka
http://www.360doc.com/content/15/0429/12/9350055_466788393.shtml 一.Kafka中的核心概念 Producer: 特指消息的生产者 Co ...
- vue-webpack所构建好的项目中增加Eslint
首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...