PAT 1022. Digital Library

【题目链接】

题意:给定一组图书信息,查询与作者,出版社等等图书信息对应的图书,并升序输出这些图书的ID,图书ID必须是七位数字。

思路,设置一个map数组,键为图书信息,用一个string变量来保存,而值为对应的图书ID,用一个set容器来存储。这样形成键值对有利于节省图书的查询时间,否则,单纯地进行暴力搜索可能会超时。

代码如下:

#include <iostream>
#include <string>
#include <map>
#include <set>
#include <cstdio>
using namespace std;

int n, m;
map<string, set<int> > info[5];

int main()
{
    //freopen("in_1022.txt", "r", stdin);
    cin >> n;
    int ID;
    for(int i = 0; i < n; i++)
    {
        cin >> ID;
        getchar(); //接收一个回车符,因为getline遇回车符结束
        for(int j = 0; j < 5; j++)
        {
            string temp;
            getline(cin, temp);
            if(j != 2) info[j][temp].insert(ID);
            else
            {
                string str;
                for(int k = 0; k < temp.size(); k++)
                {
                    if(temp[k] == ' ')
                    {
                        info[2][str].insert(ID);
                        str.clear();
                    }
                    else str += temp[k];
                    if(k == temp.size() - 1) info[2][str].insert(ID);
                }
            }
        }
    }
    cin >> m;
    for(int i = 0; i < m; i++)
    {
        int index;
        string str;
        cin >> index;
        getchar();getchar();
        getline(cin, str);
        cout << index << ": " << str << endl;
        set<int> bookID = info[index - 1][str];
        set<int>::iterator it;
        for(it = bookID.begin(); it!=bookID.end(); it++)
            printf("%07d\n", *it);
        if(bookID.empty()) cout << "Not Found" << endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值