这题第一次遇到的时候,用的模拟写出来了。其中用到了 map<pair<string,string>,int> 类型。
在学校OJ上写的这道题:传送门
样例:
输入:
A->B: Hello!
A->C: Hi!
B->A: Hehe
B->D: Hei!
D->B: How are you?
A->C: Hi???
A->C: Are you there?
B->D: Hehehei!
D->B: What does hehehei mean?
F->E: I want to hehehehehe yah.
输出:
50%
思路:
题目意思是要我们找出有几组聊天结束的话里包含有 由n个he组成的单词 的。
当时我想的是,选择一个容器,用来存两个聊天的人的名字,再选择一个数据类型存对应聊天记录里是否含有符合条件的单词。
我会这么想,其实是前几天上算法课,老师在课堂上说的一句话,数据结构的作用是在解决问题时选择一个合适的存数据的容器,算法是用来对容器中的数据进行处理。(不记得原话了,大概意思是这样 =_=!)
选择的容器我想让它符合一些要求:存的聊天的人的名字最好可以用来查找(我把它理解成可以像数组的下标一样);能存两个字符串(因为名字可能不止一个单词);可以存每组聊天的人最后一句话是否符合“止于呵呵”的要求
所以,我想到了数据结构中的一些东西:
1、用字符串做下标:map类型
2、两个字符串:pair<string,string>
3、存每组聊天最后一句话是否符合条件:用的 int 类型,1符合 ,-1不符合
写的过程中我也遇到了一些问题(有些也没想通为什么):
1、我给 string 类型变量赋值的时候,死活赋值不了,输出还是空的。。。所以在我的代码里,我用的char数组存的两个人的名字,等到需要放到map里的时候,才把它强制转换成string类型。
2、还有就是一定要记得把 char类型的变量初始化,之前没初始化,名字存入了些其他符号。。。
3、题目中也说了,要记得把大写字母转换成小写字母。
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
map<pair<string,string>,int> m;
string x,c;
while(cin>>x){
char a[20],b[20];
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
string aa,bb;
int i=0;
for(;i<x.size();i++){ //存入第一个人的名字
if(x[i]=='-') break;
a[i]=x[i];
}
for(int j=i+2;x[j]!=':';j++){ //存入第二个人的名字
b[j-i-2]=x[j];
}
getline(cin,c); //输入聊天内容
int mm=-1;
for(int j=0;j<c.size();j++){ //判断每句话是否符合“止于呵呵”的条件
if(c[j]>='A'&&c[j]<='Z') c[j]=c[j]-'A'+'a';
if(c[j-1]>='A'&&c[j-1]<='Z') c[j-1]=c[j-1]-'A'+'a';
if(c[j]=='h'&&c[j-1]==' '){
for(;c[j]=='h'||c[j]=='H';j+=2){
if(c[j]>='A'&&c[j]<='Z') c[j]=c[j]-'A'+'a';
if(c[j+1]>='A'&&c[j+1]<='Z') c[j+1]=c[j+1]-'A'+'a';
if(!(c[j]=='h'&&c[j+1]=='e')){
break;
}
}
if(j==c.size()||c[j]==' '){
mm=1;
break;
}
}
if(mm==1) break;
}
aa=a; //char数组强制转换成string类型
bb=b;
if(aa.compare(bb)>0){ //让字典序小的名字放在前面(只需要知道是哪两个人相互聊天就行了)
m[pair<string,string>(bb,aa)] = mm;
}
else
m[pair<string,string>(aa,bb)]=mm;
}
map<pair<string,string>,int>::iterator it; //迭代器
int num=0,nu=0;
for(it=m.begin();it!=m.end();it++){ //这是map的遍历
num++; //判断有几组聊天
if((it->second)==1) nu++; //判断有几组聊天符合“止于呵呵”的条件
}
double fs=nu/(double)num; //求百分比
printf("%.0lf%\n",fs*100);
return 0;
}