PAT(甲级)2022 年春季 7-1

本文介绍了一种针对字符串的评分规则,涉及首字母减分、尾部字符惩罚、长相同字母串奖励、特定字符组合扣分以及连续增长子串加分。通过实例展示了如何根据这些规则计算得分,并关注了超过特定阈值(T)的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// N 个多选题, 8 个选项 a-h
// 获得一个长度为 N 的 string
// 得分超过 T 的是

// f 开头 -2
// a 结尾 -1
// 每个最长的相同字母的串的长度大于 5 ,+3
// a 后面是 e 或 h -4
// 每个最长的连续增长的串的长度大于 3 ,+5

// N 问题的个数
// T 阈值
// K 测试者

#include <bits/stdc++.h>

using namespace std;

int main() {
#ifdef YD_DEBUG
  freopen("../in", "r", stdin);
  freopen("../out", "w", stdout);
#endif

  int n, t, k;
  cin >> n >> t >> k;

  for (int i = 0; i < k; i++) {
    string s;
    cin >> s;

    int score = 0;

    if (s[0] == 'f') {
      score -= 2;
    }

    if (s.back() == 'a') {
      score -= 1;
    }

    for (int i = 0; i < n; i++) {
      if (s[i] == 'a') {
        if (i + 1 < n and (s[i + 1] == 'e' or s[i + 1] == 'h')) {
          score -= 4;
        }
      }
    }

    for (int i = 0; i < n;) {
      char c = s[i];
      int cnt = 1;

      int j = i + 1;

      for (; j < n; j++) {
        if (s[j] == c) {
          ++cnt;
        } else {
            break;
        }
      }

      i = j;

      if (cnt > 5) {
        score += 3;
      }
    }

    for (int i = 0; i < n;) {
        char c = s[i];
        int cnt = 1;

        int j = i + 1;

        for (; j < n; j++) {
            if (s[j] == ++c) {
                ++cnt;
            } else {
                break;
            }
        }

        i = j;

        if (cnt > 3) {
            score += 5;
        }
    }

    cout << score;
    if (score > t) {
        cout << "!!!\n";
    } else {
        cout << "\n";
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值