原题链接 UVa230

思路

这题输入时有一些字符串处理操作,可以利用string的substr()函数和find_last_of()函数更加方便,处理时不必更要把书名和作者对应下来,注意到原题书名的输出是带有双引号的,而且作者只是用来排序,那么可以直接把输入截断成为标题和作者名。例如:输入 “The Canterbury Tales” by Chaucer, G. 直接将“The Canterbury Tales”作为书名,将字符串 by Chaucer, G.作为作者名,这样做并不会影响排序,而且处理起来特别方便。

这题可以把书的信息写为一个结构体,用map把书名和结构体做一个映射就可以很方便的查询书的状态了,用一个vector保存要归还的书籍的名称。

struct book
{
    string author;  //作者
    int tag;  //1代表在架上、0代表被借、-1代表归还
};

map <string,book> books;
vector <string> name;  //书名

必须先给name排序,排序要调用的函数如下

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

对于”BORROW”指令,令书名对应的状态成为0;

对于”RETURN”指令,令书名对应的状态为-1;

最后在处理”SHELVE”指令时,利用一个for从vector的头到尾遍历,如果书名对应的状态是-1,即归还的,那么就查找它的前一个在架的书名,如果前一个不存在就说明把它放在最前面;

AC代码

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<stdio.h>
using namespace std;
struct book
{
    string author;
    int tag;  //1代表在架上、0代表被借、-1代表归还
};

map <string,book> books;
vector <string> name;

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

int main()
{
    string input;
    book writer;
    while(getline(cin,input)&&input!="END")
    {
        string temp=input.substr(0,input.find_last_of("\"")+1);
        name.push_back(temp);
        writer.author=input.substr(input.find_last_of("\"")+1);
        writer.tag=1;
        books[temp]=writer;
    }
    sort(name.begin(),name.end(),cmp);
    string cmd,names;
    while(cin>>cmd&&cmd!="END")
    {
        if(cmd[0]=='S')
        {
            for(int i=0;i<name.size();i++)
            {
                if(books[name[i]].tag==-1)
                {
                    int j;
                    books[name[i]].tag=1;
                    for(j=i-1;j>=0;--j)
                    {
                        if(books[name[j]].tag==1)
                            break;
                    }
                    if(j==-1)
                    cout<<"Put "<<name[i]<<" first"<<endl;
                    else cout<<"Put "<<name[i]<<" after "<<name[j]<<endl;
                }
            }
            cout<<"END"<<endl;
        }
        else
        {
            getchar();
            getline(cin,names);
            if(cmd[0]=='B')
            {
                books[names].tag=0;
            }
            else if(cmd[0]=='R')
            {
                books[names].tag=-1;
            }
        }
    }
    return 0;
}

如有错误欢迎指出!!

UVa230 Borrowers的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers

    //又开学啦,不知不觉成为大二的老人了...时间过得好快啊,感觉好颓废... 题意:建立一个借书/归还系统.有借.还.把还的书插到书架上这三个指令. 代码:(Accepted, 0ms) //UVa2 ...

  2. UVa230 Borrowers (STL)

     Borrowers  I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...

  3. uva 230 Borrowers(摘)<vector>"结构体“ 膜拜!

    I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves ...

  4. UVa 230 Borrowers(map和set)

    I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shelve ...

  5. Borrowers

    Description I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...

  6. Borrowers UVA - 230

      I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...

  7. Uva - 230 - Borrowers

    AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cctype ...

  8. UVA 230 Borrowers (STL 行读入的处理 重载小于号)

    题意: 输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE. BORROW 和 RETURN 都会带有一个书名在后面,如: ...

  9. 【习题 5-8 UVA - 230】Borrowers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map+set写个模拟就好. 3个区域 书架.桌子.别人的手上. 其中前两个区域的书都能借出去. [代码] #include &l ...

随机推荐

  1. Python初识 - day5

    一.装饰器(decorator) 1.定义:本质是函数(装饰其它函数),就是为了其它函数添加附加功能. 2.原则:一是不能修改被装饰函数的源代码:二是不能修改被装饰函数的调用方式. 3.装饰器包含的知 ...

  2. Web Magic设计思想

    1.1 设计思想 1. 一个框架,一个领域 一个好的框架必然凝聚了领域知识.WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient.Jsoup等Java世界最成熟 ...

  3. JAVA中JPA的主键自增长注解设置

    JPA的注解来定义实体的时候,使用@Id来注解主键属性即可.如果数据库主键是自增长的,需要在增加一个注解@GeneratedValue,即: @GeneratedValue(strategy=Gene ...

  4. struts2 action 页面与action参数的传递的三种方式

    第一种: 初始页面: <form action="LoginAction.action" method="post"> 用户名:<input ...

  5. 【转】GPS定位原理

    一.距离测定原理 1.伪距测量 伪距测量是利用全球卫星定位系统进行导航定位的最基本的方法,其基本原理是:在某一瞬间利用GPS接收机同时测定至少四颗卫星的伪距,根据已知的卫星位置 和伪距观测值,采用距离 ...

  6. struts2.xml的配置问题

    1.<package namespace="/"></package> namespace决定访问action的路径: 如果省略,将代表任意路径: 2.&l ...

  7. Titanic数据分析

    一.材料准备 https://www.kaggle.com/c/titanic-gettingStarted/ 二.提出问题 生存率和哪些因素有关(性别,年龄,是否有伴侣,票价,舱位等级,包间,出发地 ...

  8. jQuery选择器概述

    1.基本选择器:1) #id : 根据给定的id匹配一个元素:2) .class: 根据给定的类名匹配元素:3)element: 根据给定的元素名匹配元素:4)* : 匹配所有元素:5)selecto ...

  9. iOS-键盘监听YYKeyboardManager

    如果键盘弹出覆盖了原有的试图,这种效果并不好,所以我们就要在键盘弹出的时候,监听键盘的位置来改变我们一些试图的位置,例如tableView列表等:在这里推荐一个大牛ibireme写的YYKeyboar ...

  10. iOS-Mac远程连接控制Window【苹果电脑远程连接控制Windows电脑】

    用Mac电脑时想远程控制Windows电脑,摸索了半天搞定了 1.下载Mac远程控制安装包:http://pan.baidu.com/s/1o7ZsDQy  提取密码:r2ja 2.安装好之后打开,就 ...