原题链接 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. BSA Network Shell系列-scriptutil命令

    scriptutil ## 1 功能概述 scriptutil复制脚本到远程机的某个目录,然后在该目录执行脚本. 它的优点就是脚本是non-NSH的脚本.不支持NSH命令,执行起来的效果和runscr ...

  2. Linux指令--chmod

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  3. Java多线程之线程的同步

    Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...

  4. linux下ftp命令的安装与使用

    注意:实际使用时可以直接尝试第5步,如果提示找不到ftp命令,再进行第4步安装,如安装失败再进行第1步,然后顺序执行即可 1. 下载rpm文件 例如:ftp-0.17-51.1.el6.x86_64. ...

  5. postgres允许别人访问连接配置

  6. python之作业--------购物车优化

    Read Me:继上次简单购物车的实现,有再一次的升级优化了下,现实现以下几个功能: 1.有客户操作和商家操作,实现,客户可以买东西,当金额不足提醒,最后按q退出,打印购物车列表 2.商家可以添加操作 ...

  7. c#代码启动任务管理器的几种方法

    1.直接启动 ProcessStartInfo info = new ProcessStartInfo(); info.FileName = Path.Combine(Environment.GetE ...

  8. 使用TensorFlow Object Detection API+Google ML Engine训练自己的手掌识别器

    上次使用Google ML Engine跑了一下TensorFlow Object Detection API中的Quick Start(http://www.cnblogs.com/take-fet ...

  9. NIO基础篇(三)

    NIO里对性能提升最显著的是内存映射(memory mapping),内存访问的速度往往比文件访问的速度快几个数量级. 在内存映射之前,还需要看NIO的一些其他的特性. 缓冲区分片 slice()方法 ...

  10. BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]

    传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...