2022春PAT甲级第一题 Simple Lie Detection (20 分)
题目大意:
背景是要测谎,有N 个多选题, 回答有8 个选项 a-h,如果答案的积分超过阈值T,则输出积分和"!!!",不超过阈值就输出积分。
规则:
- f :开头 -2
- a :结尾 -1
- 每个最长的相同字母的串的长度大于 5 :积分+3
- a 后面是 e 或 h :积分-4
- 每个最长的连续增长的串的长度大于 3 :积分+5
输入:
N:问题的个数,T:阈值,K :测试者个数,接下来是K行长度为 N 的字符串 string。
输出:
如果答案的积分超过阈值T,则输出积分和"!!!",不超过阈值就输出积分。
#include<bits/stdc++.h>
using namespace std;
int N, T, K;
int main() {
cin >> N >> T >> K;
for (int i = 0; i < K; i++) {
string str;
cin >> str;
int sum = 0;
if (str[0] == 'f') {
sum -= 2;
}
if (str[str.length() - 1] == 'a') {
sum -= 1;
}
int maxS = 0,tS=1;
int maxL=0, tL = 1;
char t=str[0];
for (int j = 1; j < str.length();j++) {
// 对字符串字符进行遍历
if (str[j] == t) {
tS++;
}
else {
// 字母不再重复
// 重复字母长度大于5
if (tS > 5)sum += 3;
tS = 1;
t = str[j];
}
if (str[j-1] == 'a' && (str[j] == 'e' || str[j] == 'h')) {
sum -= 4;
}
if (str[j] == str[j - 1] + 1) {
// 如果出现'abc'连续增长
tL++;
}
else {
if (tL > 3) {
sum += 5;
}
tL = 1;
}
}
// 到末尾处判断重复和连续增长的情况
if (tS > 5)sum += 3;
if (tL > 3) {
sum += 5;
}
cout << sum;
if (sum > T) {
cout << "!!!" ;
}
cout << endl;
}
return 0;
}