返回题解分享
讨论 / 题解分享/ 帖子详情

宝石组合(编程题) - 题解

#include <bits/stdc++.h>
using namespace std;

// 获取一个数的所有因数(包含1和自身)
vector<int> getDivisors(int x) {
    vector<int> divisors;
    // 遍历到平方根以优化因数查找效率
    for (int i = 1; i * i <= x; ++i) {
        if (x % i == 0) { // 发现因数i
            divisors.push_back(i);
            if (i != x / i) { // 避免重复添加平方根的情况
                divisors.push_back(x / i); // 对应的另一个因数
            }
        }
    }
    return divisors;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    
    int n;
    cin >> n;
    vector<int> H(n);
    // 读取所有宝石的闪亮度
    for (int i = 0; i < n; ++i) {
        cin >> H[i];
    }
    
    // 统计每个因数出现的次数(用于寻找最大公约数候选)
    unordered_map<int, int> cnt;
    
    // 遍历所有宝石
    for (int x : H) {
        // 获取当前宝石的所有因数
        vector<int> divisors = getDivisors(x);
        // 每个因数出现次数+1
        for (int d : divisors) {
            cnt[d]++;
        }
    }
    
    // 收集所有可能的公约数候选
    vector<int> uniqueD;
    for (const auto& kv : cnt) {
        uniqueD.push_back(kv.first);
    }
    
    // 将候选因数按降序排列,优先处理大的因数
    sort(uniqueD.begin(), uniqueD.end(), greater<int>());
    
    // 遍历所有候选因数
    for (int d : uniqueD) {
        // 需要至少三个数包含这个因数
        if (cnt[d] >= 3) {
            vector<int> candidates;
            // 收集所有能被d整除的宝石
            for (int x : H) {
                if (x % d == 0) {
                    candidates.push_back(x);
                }
            }
            // 需要至少三个候选才能形成组合
            if (candidates.size() >= 3) {
                // 排序确保字典序最小
                sort(candidates.begin(), candidates.end());
                // 输出前三个最小的候选
                cout << candidates[0] << " " << candidates[1] << " " << candidates[2] << '\n';
                return 0; // 找到最优解后立即退出
            }
        }
    }
    
    // 备用方案:当没有符合条件的因数时(理论上不会触发)
    vector<int> sortH = H;
    sort(sortH.begin(), sortH.end());
    // 输出全局最小的三个数(字典序保证)
    cout << sortH[0] << " " << sortH[1] << " " << sortH[2] << '\n';
    
    return 0;
}
0 回复 0 转发 0 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!