P1125 [NOIP 2008 提高组] 笨小猴

这是一个经典的字符串处理与质数判断问题。解决这个问题的核心在于字符计数求极值以及质数判定


核心思路

  1. 统计频率:使用一个长度为 26 的整数数组 cnt[26] 来记录每个字母出现的次数(下标 s[i] - 'a')。
  2. 获取极值
    • maxn:遍历数组找最大值。
    • minn:遍历数组找大于 0 的最小值(因为题目要求的是单词中出现的字母)。
  3. 质数判断:计算 \(diff = maxn - minn\)。需要注意 \(0\)\(1\) 都不是质数。

C++ 代码实现

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

// 质数判断函数
bool is_prime(int n) {
    if (n < 2) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    string s;
    cin >> s;

    int cnt[26] = {0};
    for (char c : s) {
        cnt[c - 'a']++;
    }

    int maxn = 0, minn = 100; // 单词长度小于100,初始minn设为100即可
    for (int i = 0; i < 26; i++) {
        if (cnt[i] > 0) {
            maxn = max(maxn, cnt[i]);
            minn = min(minn, cnt[i]);
        }
    }

    int diff = maxn - minn;
    if (is_prime(diff)) {
        cout << "Lucky Word" << endl;
        cout << diff << endl;
    } else {
        cout << "No Answer" << endl;
        cout << 0 << endl;
    }

    return 0;
}

关键点解析

  • 统计技巧cnt[c - 'a'] 是处理字母频率最简单高效的方法,利用了 ASCII 码的连续性。

  • minn 的初值:由于字符串长度不超过 100,将 minn 初始化为 100 或更大,可以确保在遍历过程中被正确更新。

  • 边界处理

    容易出错的地方是 \(0\)\(1\) 的处理。在 is_prime 函数中,必须明确排除 n < 2 的情况,因为在样例 2 中 \(1 - 1 = 0\),而 \(0\) 既不是质数也不是合数。

posted @ 2026-01-31 22:01  张一信奥  阅读(0)  评论(0)    收藏  举报