这个题目真是考验我的英语能力,我弄了2小时才弄懂题目的意思,后来打代码,根据别人的思维打的,因为一开始看不懂题目,就死抠,查了好久没一个负责的,题解一句话:题目怎么说我就怎么打.这题解未免太机智了,我要知道题目意思,还看你作甚。写了好多注释,有一点还是很模糊,getchar()我觉得没啥用,但是不打它就过不了。还有那个排序的东西,为啥需要它呢,我也不是很明了,学长啊,求大腿,实在不行,小腿我也不嫌弃。帮我理解一下题目了。
# include <iostream> # include <cstring> # include <cstdio> # include <cstdlib> # include <map> # include <iomanip> # include <string> using namespace std; struct node { string str1;//为了保存关键搜索,如:Banana string str2;//保存每个搜索后面的URL bool operator<(const node &a) const//排序操作,对于搜索内容相同的排它的URL顺序,否则排搜索内容 { if(a.str1==str1) { return a.str2>str2; } else return a.str1>str1; } }; char ch[10010];//存读入的一行字符串 char *word;//临时存查询词 char *p;//临时保存URL int R[105];//保存每个搜索词后URL的个数 int main() { int t,T,i,num,n,k; double Pr,sum; node temp;//作用很大。 cin>>T; getchar(); for(t=1;t<=T;t++) { cin>>n; getchar(); map<node,int> mp;//申明一个map map<node,int>::iterator it;//map的迭代器 for(i=1;i<=n;i++) { cin.getline(ch,10010);//读入一行 word=strtok(ch," ");//保存第一个分隔符””前的单词 temp.str1=word;//将搜索词保存在节点str1中 k=0; p=strtok(NULL," ");//读入此搜索词后的第一个URL while(p)//循环读入,以“”分隔符截取 { temp.str2=p;//保存在此str2中 k++;//计算个数 mp[temp]=k; p=strtok(NULL," "); } R[i]=k;//记录每个搜索词相关的URL数目 } sum=0; for(i=1;i<=n;i++) { cin.getline(ch,10010);//继续读下面n行 word=strtok(ch," "); temp.str1=word; k=0; Pr=0; num=0; p=strtok(NULL," "); while(p) { k++;//记录现在共有的URL数目 temp.str2=p; it=mp.find(temp); if(it!=mp.end()) { num++;//记录相同的个数 Pr=Pr+1.0*num/k;//计算pr mp.erase(it); } p=strtok(NULL," "); } sum=sum+Pr/R[i]; } cout<<"Case #"<<t<<": "<<fixed<<setprecision(6)<<sum/n<<endl; } }
map我觉得非水题-hdu-4329,布布扣,bubuko.com
原文:http://www.cnblogs.com/hhhhhhhhhhhhhhhhhhhhhhhhhhh/p/3881351.html