首页 > 解决方案 > 如何从数组元素的总和中减去最小元素

问题描述

对于每个测试用例 t,我需要输入 n,即数组中元素的数量,然后输入这些元素。然后我必须从所有其他元素的总和中减去数组中的最小元素。这是我的代码,但我不断收到 TLE:

#include <bits/stdc++.h>

int main(void) {
    int t;
    std::cin >> t;
    while (t --) {
        int n, sum = 0, a, k = 100000;
        std::cin >> n;
        while (n --) {
            std::cin >> a;
            if (a < k) {
                k = a;
            } else {
                sum += a;
            }
            n --;
        }
        std::cout << abs(sum - k) << "\n";
    }
}

样本输入:

3
5
20 16 8 2 13
6
16 9 12 20 15 14
4
2 2 2 2

样本输出:

55
68
4

标签: c++arraysalgorithmloopswhile-loop

解决方案


在这个 if 语句中

if (a < k) {

您正在将每个输入的值与 的当前值进行比较k,如果它小于 k 则不将其添加到sum.

例如对于这个数字序列

20 16 8 2 13

20 小于 k 的初始值。所以 nowk等于 20 并且这个数字不加到 sum.. 下一个数字 16 也小于 k 的当前值。再次,它没有被添加到总和中。

您需要对所有数字求和,同时找到最小数字。然后在循环之后从总和中减去最小的数字。

还有这个说法

 n --;

是多余的。

该程序可以如下所示

#include <iostream>

int main() 
{
    unsigned int t = 0;
    
    std::cin >> t;
    
    while ( t-- )
    {
        unsigned int n = 0;
        long long int sum = 0;
        int min = 0;
        bool first = true;
        
        std::cin >> n;
        
        while ( n-- )
        {
            int x;
            
            std::cin >> x;
            
            if ( first || x < min )
            {
                first = false;
                min = x;
            }
            sum += x;
        }
        
        std::cout << ( sum < min ? min - sum : sum - min ) << '\n';
    }
    
    return 0;
}

对于输入

1
5
20 16 8 2 13

程序输出是

57

推荐阅读