聊天止于呵呵------使用的map<pair<string,string>,int> m;

这题第一次遇到的时候,用的模拟写出来了。其中用到了 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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值