Uva 230 - Borrowers

一.题目

题目链接:Uva230


二.思路

在阅读本篇源代码之前,建议大家先了解如何给map和set添加自定义排序,还有string的substr和find函数的用法。给出两篇博客给大家参考。

string类成员函数find/find_first_of用法详解

C++ STL中Map的按Key排序和按Value排序

然后讲讲我的思路吧:因为题目要求在进行相关操作之前就要有序,我用set这样的pair集合来书目信息,定义符合题目要求的排序函数。信息录入完毕是集合已有序。然后R操作的时候也用一个这样的集合保存还书信息,先让还书的书目有序的好处是因为两个集合都是有序的,而在放书进书架的时候,字典序后的书一定会摆在字典需前的书的后面,这样子遍历一次图书馆的所存书目,就能找到所有要还的书目的位置。详情请见代码注释。


三.源代码

#include 
#include 
#include 
using namespace std;
//自定义set的排序函数使的插入是就按题目要求排序,所有信息录入完,整个数目已有序
struct Compare {
  bool operator()(const pair &a,
                  const pair &b) {
    if ((a.first).compare(b.first) < 0)  //先比较作者
      return true;
    if ((a.first).compare(b.first) == 0) { //作者相同,比较标题
      if ((a.second).compare(b.second) < 0)
        return true;
    }
    return false;
  }
};
set, Compare> stores;//用pair来保存数目信息
set, Compare> rt_bks;//用来保存还书的时候放书回书架的顺序
map books; //用来完成title到author的映射
string author, title, line;
void show() {
  set >::iterator iter1 = rt_bks.begin();
  set >::iterator iter2 = stores.begin();
  if ((*iter1) == (*iter2)) {//先把第一个拿出来单独处理,如果相等,说明是放在第一本
    cout << "Put " << (*iter1).second << " first" << endl;
    iter1++;
    iter2++;
  } else
    iter2++;
  while (iter1 != rt_bks.end()) {
      //遍历stores,如果发现要放上的书的title和stores现在的一样,就把当前书的前一本书title记录下来
    if ((*iter1) != (*iter2))
      iter2++;
    else {
      cout << "Put " << (*iter1).second << " after " << (*(--iter2)).second<


你可能感兴趣的:(acm,uva,c++,算法)