PAT——7-4 简易测谎 (20 分)

测谎通常使用一套准备好的问题提问被测试者,通过分析被测试者的反应得到结果。比较高级的测谎技术会使用测谎仪,监视被测试者的生理活动状况。我们这里的简易测谎则是通过对问题答案的特征分析来做出判断。

首先我们要求被测试者做完 N 道单选题,每道题有 8 个选项,由小写英文字母 a - h 来表示。这样就得到一个长度为 N 的、由 a - h 小写英文字母组成的字符串。对每个字符串打分,得分超过某个给定阈值 T 的就判断为“疑似说谎者”。打分原则如下:

以 f 开头的,得分 −2;
以 a 结尾的,得分 −1;
对于每一段长度大于 5 的连续选择同一字母的最长子串,得分 +3;
a 后面紧跟 e 或 h 的,得分 −4;
对于每一段长度大于 3 的连续选择相邻递增字母的最长子串(例如 abcd 或 defgh),得分 +5。
本题就请你写程序完成对被测试者的判断。

输入格式:
输入第一行给出 3 个正整数:N(6≤N≤100)为测谎问卷的题目数;T (≤100)为判断说谎的得分阈值;K(≤100)为被测试者人数。

随后 K 行,每行给出一个被测试者的答案字符串。

输出格式:
对每个被测试者的答案,在一行中输出其得分。如果分数超过阈值,则在其分数后输出 !!!。

输入样例:
12 1 6
fghaebcdeddd
ahhhhhhgbaaa
cdefffffffff
fffffghecaaa
feeeeeeeegcb
aaaaaabbbbbb
输出样例:
-1
-2
8!!!
-3
1
6!!!

 解题思路:按照题目给出的5个条件,逐条判断是否满足,然后进行分数的加减即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,t,k;
	cin>>n>>t>>k;
	for(int i=0;i<k;i++)
	{
	    int score = 0;
		string s;
		cin>>s;
		if(s[0]=='f')       //第一个条件 
		   score=score-2;
		if(s[n-1]=='a')    //第二个条件  
		   score=score-1;
		int j = 0;
	    while(j<(int)s.length())  //第三个条件 
	    {
	    	char c = s[j];	
			int x = j+1;
			while(s[x]==c)
			   x++;
			if(x-j>5)
			{
			   score = score+3;
			}
			j = x;
		}
			  
		for(int j=0;j<(int)s.length();j++)  //第四个条件 
		{
			if(s[j]=='a'&&(s[j+1]=='e'||s[j+1]=='h'))
			   score = score-4;
		}	 
		for(int j=0;j<(int)s.length()-4;j++)  //第五个条件,只要超过4个就可以+5分 
		{
			if(s[j+1]==s[j]+1)
			{
				if(s[j+2]==s[j+1]+1)
				{
					if(s[j+3]==s[j+2]+1)
					{
							score = score+5;
							
					}
				}
			}
		}
		if(score>t)
		   cout<<score<<"!!!"<<endl;
		else
		   cout<<score<<endl;
	} 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值