zoukankan      html  css  js  c++  java
  • PAT甲级1022 Digital Library

    题目https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336

    题意:

    每一本书有一个id, 书名,作者,至多五个关键字,一个出版社名,出版社年份。

    现在根据给定的书名或作者或关键字或出版社名或年份,按照id字典序大小输出符合条件的书。

    思路:

    对每一个属性都用map维护。

    一个坑点是,前面说书的年份一定在1000-3000之间,但是查询的时候的年份不一定满足,而且这里输出的时候也要满足4位。测试点1就是和年份有关的。

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<map>
      4 #include<set>
      5 #include<iostream>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<vector>
      9 #include<cmath> 
     10 #include<stack>
     11 #include<queue>
     12 
     13 #define inf 0x7fffffff
     14 using namespace std;
     15 typedef long long LL;
     16 typedef pair<string, string> pr;
     17 
     18 int n, m;
     19 const int maxn = 1e4 + 5;
     20 
     21 struct node{
     22     string id;
     23     string title;
     24     string author;
     25     string keyword[5];
     26     string publisher;
     27     int year;
     28     int keynum = 0;
     29 }book[maxn];
     30 
     31 map<string, int>titlemp;
     32 map<string, int>authormp;
     33 map<string, int>keymp;
     34 map<string, int>publishermp; 
     35 map<int, string>idmp;
     36 int titletot, authortot, keytot, publishertot, idtot;
     37 
     38 vector<int> title[maxn], author[maxn], keyword[1005], publisher[1005], year[2500];
     39 
     40 bool cmp(int a, int b)
     41 {
     42     int ida = stoi(idmp[a]), idb = stoi(idmp[b]);
     43     return ida < idb;
     44 }
     45 
     46 int main()
     47 {
     48     scanf("%d", &n);
     49     for(int i = 0; i < n; i++){
     50         getchar();getline(cin, book[i].id);
     51         idmp[i] = book[i].id;
     52         
     53         getline(cin, book[i].title);
     54         if(titlemp.find(book[i].title) == titlemp.end()){
     55             titlemp[book[i].title] = titletot++;
     56         }
     57         title[titlemp[book[i].title]].push_back(i);
     58         getline(cin, book[i].author);
     59         if(authormp.find(book[i].author) == authormp.end()){
     60             authormp[book[i].author] = authortot++;
     61         }
     62         author[authormp[book[i].author]].push_back(i);
     63         char ch;
     64         while(1){
     65             cin>>book[i].keyword[book[i].keynum];
     66             //cout<<book[i].keyword[book[i].keynum]<<endl;
     67             if(keymp.find(book[i].keyword[book[i].keynum]) == keymp.end()){
     68                 keymp[book[i].keyword[book[i].keynum]] = keytot++;
     69             }
     70             keyword[keymp[book[i].keyword[book[i].keynum++]]].push_back(i);
     71             ch = getchar();
     72             if(ch == '
    ')break;
     73         }
     74         getline(cin, book[i].publisher);
     75         if(publishermp.find(book[i].publisher) == publishermp.end()){
     76             publishermp[book[i].publisher] = publishertot++;
     77         }
     78         publisher[publishermp[book[i].publisher]].push_back(i);
     79         cin>>book[i].year;
     80         year[book[i].year - 1000].push_back(i); 
     81     }
     82     
     83     scanf("%d", &m);
     84     while(m--){
     85         int type;
     86         scanf("%d: ", &type); 
     87         string s;
     88         int id, y;
     89         //getchar();
     90         switch(type){
     91             case 1:
     92                 getline(cin, s);
     93                 printf("1: ");cout<<s<<endl;
     94                 if(titlemp.find(s) == titlemp.end()){
     95                     printf("Not Found
    ");
     96                 }
     97                 else{
     98                     id = titlemp[s];
     99                     sort(title[id].begin(), title[id].end(), cmp);
    100                     for(int i = 0; i < title[id].size(); i++){
    101                         cout<<idmp[title[id][i]]<<endl;
    102                     } 
    103                 }
    104                 break;
    105             case 2:
    106                 getline(cin, s);
    107                 printf("2: ");cout<<s<<endl;
    108                 if(authormp.find(s) == authormp.end()){
    109                     printf("Not Found
    ");
    110                 }
    111                 else{
    112                     id = authormp[s];
    113                     sort(author[id].begin(), author[id].end(), cmp);
    114                     for(int i = 0; i < author[id].size(); i++){
    115                         cout<<idmp[author[id][i]]<<endl;
    116                     } 
    117                 }
    118                 break;
    119             case 3:
    120                 getline(cin, s);
    121                 printf("3: ");cout<<s<<endl;
    122                 if(keymp.find(s) == keymp.end()){
    123                     printf("Not Found
    ");
    124                 }
    125                 //cout<<id<<endl;
    126                 else{
    127                     id = keymp[s];
    128                     sort(keyword[id].begin(), keyword[id].end(), cmp);
    129                     for(int i = 0; i < keyword[id].size(); i++){
    130                         cout<<idmp[keyword[id][i]]<<endl;
    131                     }
    132                 }
    133                 break;
    134             case 4:
    135                 getline(cin, s);
    136                 printf("4: ");cout<<s<<endl;
    137                 if(publishermp.find(s) == publishermp.end()){
    138                     printf("Not Found
    ");
    139                 }
    140                 else{
    141                     id = publishermp[s];
    142                     sort(publisher[id].begin(), publisher[id].end(), cmp);
    143                     for(int i = 0; i < publisher[id].size(); i++){
    144                         cout<<idmp[publisher[id][i]]<<endl;
    145                     }
    146                 }
    147                 break;
    148             case 5:
    149                 cin>>s;
    150                 printf("5: ");cout<<s<<endl;
    151                 y = stoi(s);
    152                 if( y<1000 || y >3000 || year[y - 1000].size() == 0 ){
    153                     printf("Not Found
    ");
    154                 }
    155                 else{
    156                     sort(year[y - 1000].begin(), year[y - 1000].end(), cmp);
    157                     for(int i = 0; i < year[y - 1000].size(); i++){
    158                         cout<<idmp[year[y - 1000][i]]<<endl;
    159                     }
    160                 }
    161                 break;
    162         }
    163     }
    164     return 0;
    165 }
  • 相关阅读:
    使用线程池对应用程序产生线程个数与占用CPU时间的影响
    枚举类型解析
    性能监视器的简单使用
    WCF 承载服务
    ManulResetEvent与AutoResetEvent
    获取当前目录的上级目录
    WCF 异步调用
    适配器设计模式
    控制控制台自身的最大化最小化
    代码自动生成技术相关介绍
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10661217.html
Copyright © 2011-2022 走看看