[刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers
//又开学啦,不知不觉成为大二的老人了。。。时间过得好快啊,感觉好颓废。。。
题意:建立一个借书/归还系统。有借、还、把还的书插到书架上这三个指令。
代码:(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的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...
随机推荐
- python sorted排序用法详解
sorted排序 python sorted 排序 1. operator函数在介绍sorted函数之前需要了解一下operator函数. operator函数是python的内置函数,提供了一系列常 ...
- [C++]STL容器Vector的内存释放
直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...
- 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别
测试开发技术:DOM中 innerHTML.innerText.outerHTML.outerText的区别 我们在做web自动化的过程中通过dom处理web页面元素,那么你就要了解innerHT ...
- 什么东西那么吸引别人的眼球!! -----------------------------------for循环
认识for循环结构 在编码过程中,把一些重复执行代码采用循环结构进行描述,可以大大减化编码工作, 使得代码更加简洁.宜都... 1. 为什么要用for? 比如: 老师叫小明统计全班人的编号,小 ...
- Entity Framework Code First在Oracle下的伪实现
为什么要说是伪实现,因为还做不到类似MsSql中那样完全的功能.Oralce中的数据库还是要我们自己手动去创建的.这里,我们舍掉了Model First中的EDMX文件,自己在代码里面写模型与映射关系 ...
- ls命令的20个实用范例
contents ls -l -h -lhS -l --block-size=M -a -d */ -g -G -n --color=never -i -p -r -R -t ls ~ ls --ve ...
- Opencv4android的Android Studio项目配置及实例下载
因为软件竞赛的项目会用到Opencv fo rAndroid,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...
- 关于 this对象 指向问题
this 定义:this是包含它的函数作为方法被调用时所属的对象.(1,this所在的函数.2,此函数作为方法被调用.3,this等于调用此函数的对象) this 对象在运行时基于函数的执行环境绑定的 ...
- 一些IO流的知识
IO流: 输入流:输出流: 字节流:字符流:为了处理文字数据方便而出现的对象. 其实这些对象的内部使用的还是字节流(因为文字最终也是字节数据) 只不过,通过字节流读取了相对应的字节数,没有对这些字节直 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...