1 条题解
-
0
题目分析
输入格式:输入由若干文档组成,以仅包含十个短横线 “----------” 的单行分隔文档。第一个文档是搜索字符串,连续出现两行十个短横线时输入结束。每个文档不超过 100 行,每行不超过 250 个字符。 处理规则:输入文档使用完整 ASCII 字符集,需将文档解析为词,词由空白字符分隔,比较时不区分大小写,比较前需去除词中的标点符号,仅由标点符号组成的词应被忽略,且搜索字符串和每个文档至少有一个有效词。
得分计算:为每个文档计算得分,先计算搜索字符串中每个词的词得分(词在搜索字符串中出现次数乘以在文档中出现次数),文档得分是每个词得分的平方 根之和,最终得分保留两位小数。
代码实现思路
fun函数: 遍历输入字符串的每个字符。 若字符是大写字母,将其转换为小写字母并添加到结果字符串t中。 若字符是小写字母或数字,直接添加到t中。 其他字符(标点等)忽略不处理。 最后返回处理后的字符串t。 处理搜索字符串: 不断读取输入字符串,若不是分隔符 “----------”,对字符串进行处理(调用fun函数),若处理后的字符串不为空,将其存入mp映射中,记录词及其出现次数。 直到遇到分隔符 “----------”,表示搜索字符串读 取结束。
处理文档并计算得分: 对于每个文档,先清空hs映射(用于存储当前文档中词及其出现次数)。 不断读取输入字符串,若不是分隔符 “----------”,对字符串进行处理,若处理后的字符串不为空,将其存入hs映射中,记录词及其出现次数。 当遇到分隔符 “----------” 时,开始计算文档得分。
遍历mp映射,对于每个词,获取其在hs映射中的出现次数,计算词得分(hs[it->first] * it->second),将词得分的平方根累加到变量jg中。 计算完所有词后,按要求格式(保留两位小数)输出文档得分jg。 重复上述过程,直到遇到连续两个分隔符 “----------”,表示输入结束。
#include <iostream> #include <cstdio> #include <map> #include <string> #include <cmath> #include <iomanip> using namespace std; string fun(string s) { string t=""; for(int i=0;i<s.size();i++) { if(s[i]>='A' && s[i]<='Z') { char c=s[i]-'A'+'a'; t=t+c; }else if(s[i]>='a' && s[i]<='z') { t=t+s[i]; }else if(s[i]>='0' && s[i]<='9') { t=t+s[i]; } } return t; } map<string,int> mp; map<string,int> hs; int main() { string s; while(1) { cin>>s; if(s=="----------") { break; } if(fun(s)!="") { mp[fun(s)]++;// } } while(1) { hs.clear(); cin>>s; if(s=="----------") { break; } if(fun(s)!="") { hs[fun(s)]++; } while(1) { cin>>s; if(s=="----------") { double jg=0; for(map<string,int> :: iterator it=mp.begin();it!=mp.end();it++) { jg=jg+sqrt((double)hs[it->first]*(double)it->second); } cout<<fixed<<setprecision(2)<<jg<<endl; break; } if(fun(s)!="") { hs[fun(s)]++; } } } return 0; }
- 1
信息
- ID
- 120
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者