您的位置:首页 > 其它

湖南省第十一届程序设计大赛 (水题)聊天止于呵呵

2016-08-25 22:17 295 查看


模拟题老师基本上都不讲,因为只要足够细心,大家都能做对。集训到今天就结束了。这次下来,

发现自己做模拟题已经很有手感了,相较于之前,真的有很大的成长。

简单的分析下这道题,

1、首先,要找出总共有多少段对话,就想到了用map<string, int>来存对话是否出现过,A->B,B->A只要没有出现hehehe...作为结束就属于同一段对话。

2、处理对话内容,把非字母转成空格,大写转小写,然后要把对话拆成单词,看是否是由hehehe...组成,就想到了前段学的stringstream

3、确定每个单词是否是由hehehe组成,这个非常简单,

输入要稍稍注意下,因为对话有空格的所以只能用gets(),或getline()接收,(或者其它我没学的,不以空格结束的接收字符串的)

代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include<cstdio>
#include<map>
#include<cstring>
#include <cmath>

using namespace std;

map<string, int> cnt;

int chi(char c[])
{
int clen= strlen(c);
if(clen%2!=0)
return 0;
else
{
for(int i=0; i<clen-1; i=i+2)
{
if(c[i]!='h'||c[i+1]!='e')
return 0;
}
return 1;
}
}
int check(char s[])
{
int slen=strlen(s);
for(int i=0; i<slen; i++)
{
if(isalpha(s[i]))
s[i] = tolower(s[i]);
else
s[i] = ' ';
}
stringstream ss(s);
char c[1005];
while(ss>>c)
{
if(chi(c)==1)
return 1;
}
return 0;
}
int main()
{
char a, b, s[1005];
double sum=0, cont=0;
while((scanf("%c->%c:", &a, &b))!=EOF)
{
gets(s);
string z, y;
z += a+b;
y += b+a;
if((!cnt.count(z)&&!cnt.count(y))||(cnt[y]==0&&cnt[z]==0))
{
cnt[y]=1;
cnt[z]=1;
sum++;
}
if(check(s)==1)  //s串中有hehehe;
{
cont++;
cnt[z]=0;
cnt[y]=0;
}
}
printf("%.0lf%%\n", cont/sum*100.0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  解题报告
相关文章推荐