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

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


代码:(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. Python快速入门(3)

    数据结构: 列表的元素可变,用[] or list()创建. 元祖的元素不可变,用() or tuple()创建. 集合的元素不可重复,用{} or set()创建. 字典的存放K-V,用dict() ...

  2. 面向对象编程思想(前传)--你必须知道的javascript

    在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...

  3. unity插件开发——MenuItem

    有unity中的菜单栏是我们经常使用到的地方,如下图: MenuItem的作用就是增加一个自己的菜单 使用方法: 在工程中Assets目录下任意一个Editor目录(以后简称Editor目录,如果不存 ...

  4. PRINCE2的好处是什么?使用PRINCE2受益非浅

    项目管理促进了全球许多公共部门与私营企业的经济活动. 优秀的项目管理意味着使用更少的资源在更短的时间内达到一个成功的结果,经过良好培训的项目经理能够帮助组织更加富有创新力,取得成功. 对那些希望展现自 ...

  5. java 8 Hashmap深入解析 —— put get 方法源码

    每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计. 对于普通的程序员,可能仅仅能说出Ha ...

  6. Linux 上做免密码登陆

    基于密钥验证1.生成一对密钥ssh-keygen -t {rsa|dsa} -f /path/to/keyfile -N 'password'2.将公钥传输至服务器某用户的家目录的.ssh/autho ...

  7. Object-C定时器,封装GCD定时器的必要性!!! (二)

    上一篇:Object-C定时器,封装GCD定时器的必要性!!! (一) 上一篇认识了Object-C中的几种定时器,这一篇将Dispatch定时器(GCD定时器)封装起来. p.p1 { margin ...

  8. 【转】PV3D的小练习~太阳系八大行星

    转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...

  9. Shell第三篇:基本语法

    一 什么是shell script 将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了. 再加上些智能(条件/流控)控制,就变成了智能化脚本了. 二 变量 part1 为何 ...

  10. Vue.js 学习笔记 一

    本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! https://github.com/zwl-jasmine95/Vue_test 以下所有知 ...