pat1022Digital Library (30)
来源:互联网 发布:国际数据分析师 编辑:程序博客网 时间:2024/04/29 07:41
题意分析:
(1)给出若干条书籍信息:按照书名、作者、关键字、出版商、出版年份的格式列出;再给出若干条检索记录,这些检索记录是围绕书名、作者、关键字、出版社以及年份,来按顺序列出查询的书的ID,考察的是排序和查找。
(2)将书的信息包装成结构体,在这些结构体当中,比较容易检索的包括书名、作者、出版社、出版年份;而对于关键字来说,由于每本书最多会有5个关键字,书的数目比较大时,如果将关键字向量或数组维护在结构体当中,每次都分别检索,检索的效率就可又能降低;因此聪明的大家也可能想到了将关键字分离出来,单独处理,按关键字的检索使用map效率会很高,而同一个关键字有可能会检索到多本书籍,所以map按关键字检索到的应该是一个书籍ID的向量
(3)也可以将书籍的各信息分开存储到map当中,但是这样又引来另外一个问题,那就是需要对每一项查询记录结果排序,额外增加了负担;这里就体现出了包装结构体的优势:只需要排序一次
可能坑点:
(1)将关键字也维护在结构体当中,导致检索超时
#include <iostream>#include <algorithm>#include <string.h>#include <sstream>#include <map>#include <vector>#include <stdio.h>using namespace std;struct bookInfo{ string ID; string title; string author; string publisher; string year;};bookInfo book[10001];map<string,vector<string> >keymap;bool cmp(bookInfo a,bookInfo b){ return a.ID<b.ID;}int main(){ int N,i=0; cin>>N; string keyword,temp; while(i<N) { cin>>book[i].ID; getchar(); getline(cin,book[i].title,'\n'); getline(cin,book[i].author,'\n'); getline(cin,keyword,'\n'); istringstream is(keyword); while(is>>temp)keymap[temp].push_back(book[i].ID); getline(cin,book[i].publisher,'\n'); getline(cin,book[i].year,'\n'); i++; } sort(&book[0],&book[N],cmp); int M; cin>>M; int j=0; int index; string query; int flag; while(j<M) { flag=0; scanf("%d: ",&index); getline(cin,query,'\n'); cout<<index<<": "<<query<<endl; if(index==1) { for(int k=0;k<N;k++) { if(book[k].title==query) { flag=1; cout<<book[k].ID<<endl; } } } else if(index==2) { for(int k=0;k<N;k++) { if(book[k].author==query) { flag=1; cout<<book[k].ID<<endl; } } } else if(index==3) { sort(keymap[query].begin(),keymap[query].end()); if(keymap[query].size()>0) { flag=1; vector<string >::iterator iter=keymap[query].begin(); for(;iter!=keymap[query].end();iter++) { cout<<*iter<<endl; } } } else if(index==4) { for(int k=0;k<N;k++) { if(book[k].publisher==query) { flag=1; cout<<book[k].ID<<endl; } } } else { for(int k=0;k<N;k++) { if(book[k].year==query) { flag=1; cout<<book[k].ID<<endl; } } } if(flag==0)cout<<"Not Found"<<endl; j++; } return 0;}
0 0
- pat1022Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- A1022. Digital Library (30)
- 1022. Digital Library (30)
- 1022. Digital Library (30)
- 黑马程序员—OC语言的self关键字和super关键字
- XML数据解析-SAX和DOM
- LintCode 丢失的第一个正整数
- 如何盗取别人的QQ密码
- Android开发基础之-----------补间动画
- pat1022Digital Library (30)
- 彻底搞定0x0d和0x0a
- linux sar
- Scala学习笔记03【学习识别Scala函数式风格】
- C/C++字节与内存问题
- 如何盗取别人的微信密码
- Apache Ignite——新一代数据库缓存系统
- Lighttpd插件链
- pku2407