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

I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves, and creators of odd volumes. --Charles Lamb, Essays of Elia (1823) ‘The Two Races of Men‘

Like Mr. Lamb, librarians have their problems with borrowers too. People don‘t put books back where they should. Instead, returned books are kept at the main desk until a librarian is free to replace them in the right places on the shelves. Even for librarians, putting the right book in the right place can be very time-consuming. But since many libraries are now computerized, you can write a program to help. 
When a borrower takes out or returns a book, the computer keeps a record of the title. Periodically, the librarians will ask your program for a list of books that have been returned so the books can be returned to their correct places on the shelves. Before they are returned to the shelves, the returned books are sorted by author and then title using the ASCII collating sequence. Your program should output the list of returned books in the same order as they should appear on the shelves. For each book, your program should tell the librarian which book (including those previously shelved) is already on the shelf before which the returned book should go.

Input

First, the stock of the library will be listed, one book per line, in no particular order. Initially, they are all on the shelves. No two books have the same title. The format of each line will be:  "title" by author  The end of the stock listing will be marked by a line containing only the word:  END  Following the stock list will be a series of records of books borrowed and returned, and requests from librarians for assistance in restocking the shelves. Each record will appear on a single line, in one of the following formats:  BORROW "title" RETURN "title" SHELVE  The list will be terminated by a line containing only the word:  END

Output

Each time the SHELVE command appears, your program should output a series of instructions for the librarian, one per line, in the format:  Put "title1" after "title2"  or, for the special case of the book being the first in the collection:  Put "title" first  After the set of instructions for each SHELVE, output a line containing only the word:  END Assumptions & Limitations  A title is at most 80 characters long.  An author is at most 80 characters long.  A title will not contain the double quote (") character.

Sample Input

"The Canterbury Tales" by Chaucer, G.
"Algorithms" by Sedgewick, R.
"The C Programming Language" by Kernighan, B. and Ritchie, D.
END
BORROW "Algorithms"
BORROW "The C Programming Language"
RETURN "Algorithms"
RETURN "The C Programming Language"
SHELVE
END

Sample Output

Put "The C Programming Language" after "The Canterbury Tales"
Put "Algorithms" after "The C Programming Language"
END

真是一看到各种麻烦的字符串的输入输出就不敢做了,真的对字符串好不熟悉。这个题感觉数据的处理确实比较麻烦以下为摘来的代码
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
using namespace std;

struct book{
    string title, author;
    bool borrowed, returned;
    book(string a,string b){
        title = a;
        author = b;
        borrowed = returned = false;
    }
};

vector<book> allbook;
string command,request,ss;

bool cmpa(book a,book b)
{
    return (a.author < b.author);
}

bool cmpt(book a,book b)
{
    return (a.title < b.title);
}

void shelve()
{
    int j;
    for(int i = 0; i < allbook.size();i++){
        if(allbook[i].returned == true){
            for(j = i; j >= 0;j--){
                if(allbook[j].borrowed == false)break;
            }
            if(j == -1)printf("Put %s first\n", allbook[i].title.c_str());                   //之前的所有书都被借走了
            else printf("Put %s after %s\n",allbook[i].title.c_str(), allbook[j].title.c_str());
            allbook[i].borrowed = allbook[i].returned = false;
        }
    }
    cout << "END\n";
}

void borrow()
{
    getline(cin, request);
    for(int i = 0;i < allbook.size(); i++){
        if(allbook[i].title == request){
            allbook[i].borrowed = true;
            return;
        }
    }
}

void back()
{
    getline(cin, request);
    for(int i = 0; i < allbook.size(); i++ ) {
        if(allbook[i].title == request){
            allbook[i].returned = true;
            return;
        }
    }
}

int main()
{
    while(getline(cin,ss)&&ss!="END"){
        allbook.push_back(book(ss.substr( 0, ss.find_last_of( "\"" ) + 1 ),
            ss.substr(ss.find_last_of( "\"" ) + 1 )));
    }
    stable_sort(allbook.begin(), allbook.end(), cmpt);
    stable_sort(allbook.begin(), allbook.end(), cmpa);
    while(cin >> command){
         if( command == "BORROW" )
            cin.get(), borrow();
         else if( command == "RETURN" )
            cin.get(), back();
         else if( command == "SHELVE" )
            cin.get(), shelve();
    }
    //system("pause");
    return 0;
}

把C++中的string 转化为C中的%s输出,要用c_str() ,否则输出的是一堆乱码
看完后觉得操作并不是很难,然而思路和对字符串的处理都值得膜拜!

				
时间: 2025-01-01 09:02:08

uva 230 Borrowers(摘)<vector>"结构体“ 膜拜!的相关文章

UVA 230 Borrowers(vector和map的应用,模拟)

1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cstring> 6 #include<string> 7 #include<iostream> 8 using namespace std; 9 typedef long long ll; 10 /** 11 题意:SHELVE

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

题意: 输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE. BORROW 和 RETURN 都会带有一个书名在后面,如: BORROW "The Canterbury Tales"RETURN "The Canterbury Tales" 当遇到SHELVE指令,输出已还但没上架的书排序后(规则同上)依次插入书架的序列. 用例: 输入: "The Canterbury Tale

【UVA】230 - Borrowers(map模拟)

利用map<string,int>判断一本书的状态,0代表借出去了,1代表在书架,2代表借出去换回来但是还未放回书架 设计一些字符串的处理问题,用一些字符串搜索函数比如 strstr , strchar等等 14072706 230 Borrowers Accepted C++ 0.015 2014-08-21 02:59:27 AC代码: #include<cstdio> #include<cstring> #include<iostream> #incl

【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

C++中的结构体vector排序

在包含了头文件#include <algorithm>之后,就可以直接利用sort函数对一个vector进行排序了: 1 // sort algorithm example 2 #include <iostream> // std::cout 3 #include <algorithm> // std::sort 4 #include <vector> // std::vector 5 6 bool myfunction (int i,int j) { re

转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<

UVa 227 / UVALive 5166 Puzzle 谜题 (结构体)

Puzzle Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   A children's puzzle that was popular 30 years ago consisted of a 5x5 frame which contained 24 small squares of equal size. A unique letter of the alphabet

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

C++重载流运算符,将存储结构体的vector直接写入文件

我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次性写入,存储struct的vector也是可以的,这里举一个简单的例子,声明结构体: struct point { double lat; //纬度 double lon; //经度 unsigned long long time; //时间 } 写一个类封装流运算符: class onepoint