1 条题解

  • 0
    @ 2025-4-19 21:56:36

    题目分析

    输入格式:输入由若干文档组成,以仅包含十个短横线 “----------” 的单行分隔文档。第一个文档是搜索字符串,连续出现两行十个短横线时输入结束。每个文档不超过 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
    上传者