UVA230 Borrowers 图书管理系统 解题报告

题目链接

https://vjudge.net/problem/UVA-230

题目大意

你的任务是模拟一个图书管理系统。首先输入若干图书的标题和作者(标题各不相同,以END结束),然后是若干指令:BORROW指令表示借书,RETURN指令表示还书,SHELVE指令表示把所有已归还但还未上架的图书排序后依次插入书架并输出图书标题和插入位置(可能是第一本书或者某本书的后面)。

图书排序的方法是先按作者从小到大排,再按标题从小到大排。在处理第一条指令之前,你应当先将所有图书按照这种方式排序。

解题思路

用map< string, int >维护书名与书的状态之间的映射,1为在书架,2为借出,3为归还但不在书架,剩下的就全都是按照题意硬模拟,用最纯粹的,最朴素的,最丁真(bushi)的循环遍历是足够AC的,也就懒得想优化了,细节很多,具体参考代码和注释。

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int INF = 0x3fffffff;
const int mod = 1000000007;
struct Book {
    string title;
    string author;
    bool operator < (const Book &other) const {
        if (author == other.author)
            return title < other.title;
        return author < other.author;
    }
};
vector<Book> books;
map<string, int> state; // 书的状态,1为在书架,2为借出,3为归还但不在书架

void solve() {
    string s, title, author;
    while (getline(cin, s), s != "END") {
        int pos = s.find("\"", 1);
        title = s.substr(1, pos);
        pos += 5;
        author = s.substr(pos);
        books.push_back({title, author});
        state[title] = 1;
    }
    sort(books.begin(), books.end());
    while (getline(cin, s), s != "END") {
        if (s[0] == 'B') {
            title = s.substr(8);
            state[title] = 2;
        } else if (s[0] == 'R') {
            title = s.substr(8);
            state[title] = 3;
        } else {
            for(int i = 0 ; i < books.size() ; i++) {
                if (state[books[i].title] == 3) {
                    int j;
                    for (j = i - 1; j >= 0; j--) {
                        if (state[books[j].title] == 1) {
                            break;
                        }
                    }
                    cout << "Put \"" << books[i].title << " ";
                    if (j != -1) {
                        cout << "after \"" << books[j].title <<endl;
                    } else {
                        cout << "first" << endl;
                    }
                    state[books[i].title] = 1;
                }
            }
            cout << "END\n";
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout << fixed;
    cout.precision(18);

    solve();
    return 0;
}

相关推荐

  1. UVA230 Borrowers 图书管理系统 解题报告

    2024-04-12 04:10:04       39 阅读
  2. UVA10391 Compound Words 复合词 解题报告

    2024-04-12 04:10:04       27 阅读
  3. UVA1595 Symmetry 对称轴 解题报告

    2024-04-12 04:10:04       33 阅读
  4. UVA247 Calling Circles 解题报告

    2024-04-12 04:10:04       34 阅读
  5. UVA10935 Throwing cards away I 卡片游戏 解题报告

    2024-04-12 04:10:04       30 阅读
  6. UVA839 Not so Mobile 天平 解题报告

    2024-04-12 04:10:04       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 04:10:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 04:10:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 04:10:04       82 阅读
  4. Python语言-面向对象

    2024-04-12 04:10:04       91 阅读

热门阅读

  1. Python:闭包

    2024-04-12 04:10:04       45 阅读
  2. Web蓝桥杯刷题记录——燃烧你的卡路里

    2024-04-12 04:10:04       37 阅读
  3. oracle全量、增量备份

    2024-04-12 04:10:04       39 阅读
  4. 【Python】Python中大文件切割的艺术

    2024-04-12 04:10:04       41 阅读
  5. leetcode解题思路分析(一百五十五)1352 - 1358 题

    2024-04-12 04:10:04       37 阅读
  6. 0411代码,备战蓝桥杯基础数据结构

    2024-04-12 04:10:04       34 阅读
  7. fzf模糊查找工具

    2024-04-12 04:10:04       32 阅读
  8. 我心目中的福克斯和马自达

    2024-04-12 04:10:04       38 阅读
  9. Redis面试题1

    2024-04-12 04:10:04       39 阅读
  10. jQuery 数字金额转化为英文大写

    2024-04-12 04:10:04       37 阅读