UVa230 Borrowers
原题链接 UVa230
思路
这题输入时有一些字符串处理操作,可以利用string的substr()函数和find_last_of()函数更加方便,处理时不必更要把书名和作者对应下来,注意到原题书名的输出是带有双引号的,而且作者只是用来排序,那么可以直接把输入截断成为标题和作者名。例如:输入 “The Canterbury Tales” by Chaucer, G. 直接将“The Canterbury Tales”作为书名,将字符串 by Chaucer, G.作为作者名,这样做并不会影响排序,而且处理起来特别方便。
这题可以把书的信息写为一个结构体,用map把书名和结构体做一个映射就可以很方便的查询书的状态了,用一个vector保存要归还的书籍的名称。
struct book
{
string author; //作者
int tag; //1代表在架上、0代表被借、-1代表归还
};
map <string,book> books;
vector <string> name; //书名
必须先给name排序,排序要调用的函数如下
bool cmp(string a,string b)
{
if(books[a].author<books[b].author)
return true;
else if(books[a].author==books[b].author&&a<b)
return true;
return false;
}
对于”BORROW”指令,令书名对应的状态成为0;
对于”RETURN”指令,令书名对应的状态为-1;
最后在处理”SHELVE”指令时,利用一个for从vector的头到尾遍历,如果书名对应的状态是-1,即归还的,那么就查找它的前一个在架的书名,如果前一个不存在就说明把它放在最前面;
AC代码
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<stdio.h>
using namespace std;
struct book
{
string author;
int tag; //1代表在架上、0代表被借、-1代表归还
};
map <string,book> books;
vector <string> name;
bool cmp(string a,string b)
{
if(books[a].author<books[b].author)
return true;
else if(books[a].author==books[b].author&&a<b)
return true;
return false;
}
int main()
{
string input;
book writer;
while(getline(cin,input)&&input!="END")
{
string temp=input.substr(0,input.find_last_of("\"")+1);
name.push_back(temp);
writer.author=input.substr(input.find_last_of("\"")+1);
writer.tag=1;
books[temp]=writer;
}
sort(name.begin(),name.end(),cmp);
string cmd,names;
while(cin>>cmd&&cmd!="END")
{
if(cmd[0]=='S')
{
for(int i=0;i<name.size();i++)
{
if(books[name[i]].tag==-1)
{
int j;
books[name[i]].tag=1;
for(j=i-1;j>=0;--j)
{
if(books[name[j]].tag==1)
break;
}
if(j==-1)
cout<<"Put "<<name[i]<<" first"<<endl;
else cout<<"Put "<<name[i]<<" after "<<name[j]<<endl;
}
}
cout<<"END"<<endl;
}
else
{
getchar();
getline(cin,names);
if(cmd[0]=='B')
{
books[names].tag=0;
}
else if(cmd[0]=='R')
{
books[names].tag=-1;
}
}
}
return 0;
}
如有错误欢迎指出!!
UVa230 Borrowers的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers
//又开学啦,不知不觉成为大二的老人了...时间过得好快啊,感觉好颓废... 题意:建立一个借书/归还系统.有借.还.把还的书插到书架上这三个指令. 代码:(Accepted, 0ms) //UVa2 ...
- UVa230 Borrowers (STL)
Borrowers I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...
- uva 230 Borrowers(摘)<vector>"结构体“ 膜拜!
I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves ...
- UVa 230 Borrowers(map和set)
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shelve ...
- Borrowers
Description I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...
- Borrowers UVA - 230
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...
- 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 ...
随机推荐
- 重温MFC
1. Button控件 2. 旋转和高级编辑控件 3. 标签控件和属性页 4. 列表控件 5. 树控件 6. 进度条控件和滑动条控件 7. 滚动条 8.工具栏和状态栏
- Certificate downloaded from cloudexpress:11443 is invalid
问题描述: CertificateManagement : Server is not trusted.Received fatal alert: handshake_failure. Now ins ...
- JAVA中科学计数法转换普通计数法
今天发现数据库里汇总的数据有点大,一输出就被自动转化成科学计数法了.后来发现是转换字符串的方法有问题.如下: String a = "11234567.89"; BigDecima ...
- java 重写与重载
一.方法重写: 参数列表必须完全与被重写方法的相同: 返回类型必须完全与被重写方法的返回类型相同: 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那么在 ...
- SQL Server 2005的服务器角色(public)的问题
SQL Server 默认会有9个服务器角色,而且这些角色是不能删除和新增.修改的.关于这些角色相关介绍和权限,请参考 其中有一个特殊的角色public,任何登录都会属于该角色,它只拥有的权限是VIE ...
- awk grep sed cut学习
awk学习网站 grep sed cut
- Redis进阶实践之九 独立封装的RedisClient客户端工具类
一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己写了两个工具类,但是这两个工具类,没有提供一致的接口,是为了使用的独立 ...
- ferror,perror,cleaner
1.ferror 函数原型: int ferror(FILE *fp) 功能:测试文件是否出现错误 返回值:未出错是0:出错为非0. 每次调用文件输入输出函数,均产生一个新的ferror函数值 fop ...
- virtualbox创建虚拟机及增加硬盘记录
创建虚拟机 jken01VBoxManage createvm --name "jken01" --basefolder /data/virtualDir/jken01 --reg ...
- Android逆向之so的半自动化逆向
因为工作需要,转型干android逆向,有几个月了.不过对于so的逆向,任然停留在,难难难的阶段,虽然上次自己还是逆向了一个15k左右的小so文件,但是,那个基本是靠,一步一步跟代码,查看堆栈信息来自 ...