1 条题解

  • 0
    @ 2025-5-19 20:51:52

    解题思路

    1. 问题分析

      • 需要从NN个数中选择若干个数,使得它们的kk次方和最大。
      • 直接选择所有正数即可(因为负数的kk次方可能减小总和)。
    2. 关键步骤

      • 遍历所有儿子,若其智力潜能的kk次方为正,则选中。
      • 计算选中项的kk次方和。
    3. 数学公式

      • 最大和S=iaik>0aikS = \sum_{\substack{i \\ a_i^k > 0}} a_i^k

    代码实现(C++98)

    #include <cstdio>
    #include <cmath>
    using namespace std;
    
    int main() {
        int N, k, a[100];
        scanf("%d%d", &N, &k);
        for (int i = 0; i < N; ++i) scanf("%d", &a[i]);
    
        int sum = 0;
        for (int i = 0; i < N; ++i) {
            int term = 1;
            for (int j = 0; j < k; ++j) term *= a[i]; // 计算a[i]的k次方
            if (term > 0) sum += term; // 仅累加正值
        }
        printf("%d\n", sum);
        return 0;
    }
    

    代码解释

    1. 输入处理:读取儿子数量NN、幂指数kk及每个儿子的智力潜能。
    2. 计算和
      • 对每个儿子,计算其智力潜能的kk次方。
      • 若结果为正值,则累加到总和中。
    3. 输出结果:打印最大和。

    复杂度

    • 时间复杂度:O(Nk)O(N \cdot k)(每个儿子最多计算33次乘法)。
    • 空间复杂度:O(N)O(N)(存储智力潜能数组)。
    • 1

    信息

    ID
    1210
    时间
    3000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者