UVA 230 Borrowers (STL 行读入的处理 重载小于号)
题意:
输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE。
BORROW 和 RETURN 都会带有一个书名在后面,如:
BORROW "The Canterbury Tales"
RETURN "The Canterbury Tales"
当遇到SHELVE指令,输出已还但没上架的书排序后(规则同上)依次插入书架的序列。
用例:
输入:
"The Canterbury Tales" by Chaucer, G.
"Algorithms" by Sedgewick, R.
"The C Programming Language" by Kernighan, B. and Ritchie, D.
END
BORROW "The Canterbury Tales"
RETURN "The Canterbury Tales"
BORROW "The C Programming Language"
RETURN "The C Programming Language"
SHELVE
BORROW "Algorithms"
RETURN "Algorithms"
SHELVE
END
输出:
Put "The Canterbury Tales" first
Put "The C Programming Language" after "The Canterbury Tales"
END
Put "Algorithms" after "The C Programming Language"
END
分析:
这题的读入有点麻烦,我的处理是使用getline, 然后将 “ 号变成空格 将空格变成“#”(ASCII差距不大), 再用stringsteam输入到string中,最后输出再将“#”转换为“ ”。
网上的方法是使用string.substr()截取,用string.find()去寻找位置, 我截取这种方法更好(stringsteam很慢)。
用map<string,int>将string映射到书架位置上面,用一个bool去标记这个位置有没被拿走,注意return后不能直接把书放回去,要标记,等收到SHELVE指令再排序放书。
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <set>
#include <sstream>
#include <algorithm>
using namespace std;
struct B
{
string name;
string author;
B(){}
B(const string& _name,const string& _author):
name(_name),author(_author){}
friend bool operator < (const B a,const B b)
{
if(a.author < b.author) return true;
else
{
if(a.author == b.author)
{
if(a.name < b.name)
return true;
else return false;
}
else return false;
}
}
};
struct A
{
int a;
int b;
A(){}
A(int _a, int _b):
a(_a), b(_b){}
// a after b of a is the first(b=-1);
};
typedef set<B> :: iterator sIT;
typedef vector<B> :: iterator vIT;
typedef vector<A> :: iterator aIT;
typedef vector<int> :: iterator IT;
string trans(const string& a)
{
string t = a;
for(int i = ; i < t.size(); i++)
{
if(t[i] == '#') t[i] = ' ';
}
return t;
}
int main()
{
ios::sync_with_stdio(false);
#if LOCAL
freopen("1.txt","r",stdin);
freopen("2.txt","w",stdout);
#endif // LOCAL
string s;
vector<B> book;
bool lend[];
vector<A> ans;
fill(lend, lend+,);
map<string,int> id;
vector<int> ret;
while(getline(cin,s))
{
for(int i = ; i < s.size(); i++)
{
if(s[i] == '"') s[i] = ' ';
else if(s[i] == ' ') s[i] = '#';
}
stringstream ss(s);
string tname, tauthor;
if(!(ss>>tname>>tauthor)) break;
book.push_back(B(tname,tauthor));
}
sort(book.begin(), book.end());
int cnt = ;
for(vIT it = book.begin(); it != book.end(); it++)
{
id[(*it).name] = cnt++;
}
string op;
while(cin>>op)
{
if(op=="END") break;
if(op == "SHELVE")
{
sort(ret.begin(), ret.end());
for(IT it = ret.begin(); it != ret.end(); it++)
{
lend[*it] = ;
int c = (*it) -;
for(; c >= && lend[c] == ; c--);
ans.push_back(A(*it,c));
}
ret.clear();
for(aIT it = ans.begin(); it != ans.end(); it++)
{
if((*it).b != -)
{
cout<<"Put \""<< trans(book[(*it).a].name) << "\" after \"" << trans(book[(*it).b].name) << "\"\n"; }
else
{
cout<<"Put \""<<trans(book[(*it).a].name)<< "\" first"<<"\n"; }
}
ans.clear();
cout<<"END\n";
continue;
}
cin.ignore();
string b;
getline(cin,b);
for(int i = ; i < b.size(); i++)
{
if(b[i] == '"') b[i] = ' ';
else if(b[i] == ' ') b[i] = '#';
}
stringstream ss(b);
ss>>b;
if(op== "BORROW")
{
lend[id[b]] = ;
}
else if(op == "RETURN")
{ ret.push_back(id[b]);
}
} return ;
}
UVA 230 Borrowers (STL 行读入的处理 重载小于号)的更多相关文章
- 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 ...
- Uva - 230 - Borrowers
AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cctype ...
- Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录
第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
- string行读入&&文件输入
普通读入的时候会以空格作为分隔符 直接用cin>>s读入,此时可以直接处理文件尾的情况 text代码: #include <iostream>#include <cstd ...
- Borrowers UVA - 230
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...
- 【习题 5-8 UVA - 230】Borrowers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map+set写个模拟就好. 3个区域 书架.桌子.别人的手上. 其中前两个区域的书都能借出去. [代码] #include &l ...
- UVa230 Borrowers (STL)
Borrowers I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...
- C/C++如何整行读入字符串?
在写代码的过程中,经常要一行一行的读入字符串进行处理,这里我总结了一些方法,供大家参考. 方法一:scanf()读入char[] 使用方法: ]; scanf("%[^\n]",& ...
随机推荐
- 《Windows核心编程系列》八谈谈用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- [CTSC2000]丘比特的烦恼
Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...
- _bzoj2243 [SDOI2011]染色【树链剖分】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 裸的树链剖分,最开始我保存一个线段树节点的color值时(若有多种颜色则为-1),不小 ...
- MyEclipse2014+Maven配置记录
一.MyEclipse配置Maven 打开MyEclipse2014,选择菜单:Window --> Preferences,选择:MyEclipse-Maven4MyEclipse-Insta ...
- Android上的线程安全
Thread-safe methods In some situations, the methods you implement might be called from more than one ...
- border-1px的实现(stylus)
当样式像素一定时,因手机有320px,640px等.各自的缩放比差异,所以设备显示像素就会有1Npx,2Npx.为保设计稿还原度,解决就是用media + scale. // stylus语法 bor ...
- jmeter(十四)解读聚合报告
一个每天1000万PV的网站需要什么样的性能去支撑呢?继续上一篇,下面我们就来计算一下,前面我们已经搞到了一票数据,但是这些数据的意义还没有说.技术是为业务服务的,下面就来说说怎么让些数据变得有意义. ...
- 213 House Robber II 打家劫舍 II
注意事项: 这是 打家劫舍 的延伸.在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意.这一次,这个地方的所有房屋都围成一圈.这意味着第一个房子是最后一个是紧挨着的.同时,这 ...
- spark yarn cluster模式下任务提交和计算流程分析
spark可以运行在standalone,yarn,mesos等多种模式下,当前我们用的最普遍的是yarn模式,在yarn模式下又分为client和cluster.本文接下来将分析yarn clust ...
- VB6程序中NULL注意事项
VB6中从数据库中取出栏位值进行操作,若栏位值为Null,则必须小心处理,否则极易导致程序出错退出. 通常我们从recordset中取出栏位值采用Fields方法,加上栏位名称,如 rsMoney.F ...