首页 > 其他 > 详细

1022 Digital Library (30分)

时间:2020-03-21 18:16:11      阅读:40      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

这个题挺好的。学习了map和set的使用,还有字符串的接收和输出。参考了柳神的代码。

题目要求根据title,author,key,publisher,year来输出对应书的编号,思路是建立map<关键码,编号的集合>,关键码就是title,author,key,publisher,year,根据在一堆数据中迅速的根据关键码找到对应信息,且关键码不重复,应该用map。很简单的想法是用数组存储,一个个遍历,比较麻烦且耗时。

将函数的参数设置为引用会节省很多时间,不知道原理是什么,记录一下。可能是因为,在map很大时,如果不设置形参为引用,每次查找将会复制一份map,这应该很花时间(当要查找的次数很多时)。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<set>
 4 #include<map>
 5 #include<string>
 6 using namespace std;
 7 void output(map<string,set<int> > &xx,string &ss,int num){//测试点5,引用做形参节省时间 
 8     map<string,set<int> >::iterator it = xx.find(ss);
 9     printf("%d: ",num);
10     cout<<ss<<endl;
11     if(it==xx.end())  
12         printf("Not Found\n");
13     else
14     {   set<int>::iterator ii=xx[ss].begin();
15         for(ii=xx[ss].begin();ii!=xx[ss].end();ii++)
16             printf("%07d\n", *ii);    //测试点4,5。前面为一串0的编号也要正确输出 
17     }    
18 }
19 int main()
20 {    
21   int n;
22   scanf("%d\n",&n);//注意这个换行符一定不能省略,不然会留在缓冲区造成下面的字符串读取混乱 ,或者不写\n,在下一行用getchar()吸收换行 
23   int id;
24   string title,author,key,publisher,year;
25   map<string,set<int> > Title,Author,Key,Publisher,Year;
26   for(int i=0;i<n;i++){
27       scanf("%d\n",&id);////注意这个换行符一定不能省略,不然会留在缓冲区造成下面的字符串读取混乱,或者不写\n,在下一行用getchar()吸收换行 
28       
29       getline(cin,title);
30       Title[title].insert(id);
31       
32       getline(cin,author);
33       Author[author].insert(id);
34       
35       while(cin>>key) {
36         Key[key].insert(id);
37         char c=getchar();//吸收空格和换行 
38         if(c==\n) 
39             break;        
40         }
41       
42       getline(cin,publisher);
43       Publisher[publisher].insert(id);
44       
45       getline(cin,year);
46       Year[year].insert(id);
47   }
48   int M,num;
49   string ss;
50   scanf("%d",&M);
51   for(int i=0;i<M;i++){
52        scanf("%d: ",&num);
53        getline(cin,ss);
54        if(num==1)      output(Title,ss,1);
55      else if(num==2) output(Author,ss,2);
56      else if(num==3) output(Key,ss,3); 
57      else if(num==4) output(Publisher,ss,4); 
58      else            output(Year,ss,5);           
59   }
60   return 0;
61 }

 参考链接:https://www.liuchuo.net/archives/2295

1022 Digital Library (30分)

原文:https://www.cnblogs.com/wsshub/p/12540682.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!