//又开学啦,不知不觉成为大二的老人了。。。时间过得好快啊,感觉好颓废。。。

题意:建立一个借书/归还系统。有借、还、把还的书插到书架上这三个指令。


代码:(Accepted, 0ms)

//UVa230 - Borrowers
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std; struct BOOK {
string au, ti;
BOOK(const string& a, const string& t) :au(a), ti(t) {}
BOOK() :ti("X"), au("X") {}
bool operator <(const BOOK &that)const {
if (au == that.au) return ti < that.ti;
return au < that.au;
}
};
map<BOOK, bool> list;//int:0在书架 1已经借出
map<string, BOOK> auth;
set<BOOK> ret;//归还列表
string tmp; void B(const string& t) {
list[auth[t]] = true;
} void R(const string& t) {
auto f = list.find(auth[t]);
ret.insert(f->first);
} void S() {
for (auto& r : ret) {
cout << "Put " << r.ti;
auto re = list.find(r),p=re;
//if (re == list.end()) cout << "FUCK!\n";//
while (p != list.begin() && (--p)->second);
//cout << "喵喵喵?????\n";//
if (p == list.begin() && p->second) cout << " first\n";
else cout << " after " << p->first.ti << '\n';
re->second = false;
}
cout << "END\n";
ret.clear();
} int main()
{
//freopen("in.txt", "r", stdin);
while (getline(cin, tmp) && tmp[0] != 'E') {
size_t n = tmp.rfind('\"');
string ti(tmp.substr(0, n + 1));
string au(tmp.substr(n + 5, tmp.size() - n - 6));
list[BOOK(au, ti)] = false;
auth[ti] = BOOK(au, ti);
}
//for (auto&r : list) cout << "--" << r.first.ti << '\t' << r.first.au << endl;//
while (getline(cin, tmp) && tmp[0] != 'E') {
if (tmp[0] == 'B') B(tmp.substr(7));
else if (tmp[0] == 'R') R(tmp.substr(7));
else S();
}
return 0;
}

分析:使用了STL的map和set。一个map存放所有书(书的作者与标题作为key,借阅/归还状态为value),一个map用来从标题映射到书的信息(因为下面borrow和return指令里不带作者信息,映射一下方便,但我内心还是不大情愿。的确有更好的方法,我不大会,下面再讲。)还有一个set存储归还了但还未放回书架的书。其他没啥要说的。

本来想将key设为标题,value设为作者的,但是不知道如何将map按value排序。查了查要用到vector+pair 中转,好像有点烦啊。但是网上看到这个,http://blog.csdn.net/a197p/article/details/43747539 。他就是采用了

struct book{
string author;
int status;
};
map<string, book> books;

来存储。我还以为他能给map按照value重排,结果他建立了个vector< string > name; 来存放标题,存放顺序用以下方法

bool compare(string a, string b){
if(books[a].author == books[b].author) return a < b;
else return books[a].author < books[b].author;
}

原来是稍微绕了一下,但是也不错耶。

[刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

  5. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  6. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  7. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  8. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

  9. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  10. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. python3编码问题终结者--还搞不懂你来找我

    python unicode bytes str 编码 首先需要说明一下,该篇文章是以python3为基础的,python2是否适合没有验证过.由于python编码问题确实比较多,文章篇幅可能较长,请 ...

  2. ReentrantLock源码分析与理解

    在上面一篇分析ThreadExecutedPool的文章中我们看到线程池实现源码中大量使用了ReentrantLock锁,那么ReentrantLock锁的优势是什么?它又是怎么实现的呢? Reent ...

  3. 数据库CAST()函数和CONVERT()函数比较

    对简单类型转换,CAST()函数和CONVERT()函数的效果一致,只是语法不同.前者更易使用,而后者的优势是格式化时间和数值.在以下这几种情况,二者一样: 1-1.SELECT CONVERT(de ...

  4. poptest老李谈数据结构中深度优先和广度优先

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  5. js动弹特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. ajax第三步

    ajaxSend()函数用于设置当AJAX请求即将被发送时执行的回调函数. 这是一个全局AJAX事件函数,用于为任何AJAX请求的ajaxSend事件绑定事件处理函数.当AJAX请求即将被发送时,将触 ...

  7. Oracle to_date函数

    TO_DATE格式(以时间:2007-11-02   13:45:25为例)Year:      yy two digits 两位年                显示值:07yyy three di ...

  8. 这个demo是为解决IQKeyboardManager和Masonry同时使用时,导航栏上移和make.right失效的问题

    原文链接在我的个人博客主页 (一).引言: 在 IQKeyboardManager 和 Masonry 同时使用时,导航栏上移和make.right失效等问题多多. 其实我们完美的效果应该是这样的:* ...

  9. 【Azure】Azure学习方法和学习资料

    学习方法: DEX为入门培训,fundamental book进阶材料,Azure 官方为补充权威材料,网站一些大拿的Blog是很多实践精华,推荐阅读. 推荐教材和学习内容: EDX培训:http:/ ...

  10. Linq: Aggregate

    Aggregate累加器 今天看东西的时候看见这么个扩展方法Aggregate(累加器)很是陌生,于是乎查了查,随手记录一下. 直接看一个最简答的版本,其他版本基本没什么区别,需要的时候可看一下 pu ...