黑客等级C ++的最小最大和

时间:2019-12-10 16:01:29

标签: c++

给出五个正整数,找到可以通过对五个整数中的四个精确求和而得出的最小值和最大值。然后将相应的最小值和最大值打印为两个空格分隔的长整数的单行。

void min_max(unsigned  long  int arr[]){
            unsigned  long  int max = arr[0];
            unsigned  long  int min = arr[0];
            for(int i=1; i<5; i++){
            if(arr[0] > arr[i]) min = arr[i];
            if(arr[0] < arr[i]) max = arr[i];
        }
        cout << min << " " << max;
    }

unsigned  long  int Sum(unsigned  long  int arr[], int n){
    unsigned  long  int sum = 0;
    for(int i = 0; i<5; i++){
        sum += arr[i];
    }
    sum = sum - arr[n];
    return sum;
}

int main(){
    unsigned  long  int arr[5];
    for(int i=0; i<5; i++){
        cin >> arr[i];
    }

    unsigned  long  int SUM[5];
    for(int j=0; j<5; j++){
        SUM[j] = Sum(arr, j);
    }
    min_max(SUM);
}

如果输入数字很小,那么我的代码就没问题,但是,当说一些非常大的数字(例如293247447)时,它表示测试用例失败了。我不知道为什么,有人可以帮我吗?

4 个答案:

答案 0 :(得分:1)

您将看到的简便解决方案,仅两个循环,但复杂度可能很高O(N*N)

void miniMaxSum(vector<int> arr)
{
    // LLONG_MAX --> set min to the highest value in long long 
    // LLONG_MIN --> set max to the lowest value in long long but why lowest value ? because you want highest value
    long long min = LLONG_MAX , max = LLONG_MIN , sum ;
    for(int i = 0 ;i < arr.size() ; ++i)
    {
        sum = 0;
        for(int j = 0; j < arr.size() ; ++j)
        {
            if(i != j)
                sum += arr[j];
        }

        if(sum > max)
            max = sum;

        if (sum < min)
            min = sum;
    }

    cout << min << " " << max << endl;
}

答案 1 :(得分:0)

您的min_max函数错误。您一直在与arr[0]进行比较,如果arr[0]是值的最小/秒最小(最小)或最大/秒最大(最大),则返回正确的结果。

正确的比较是

        if (min > arr[i]) min = arr[i];
        if (max < arr[i]) max = arr[i];

        if (arr[i] < min) min = arr[i];
        else if (arr[i] > max) max = arr[i];

这使得它更容易理解正在执行的操作。 else是可选的,但如果第一个为true,则避免第二个比较(因为如果第一个为true,则第二个始终为false)。

答案 2 :(得分:0)

您应该了解自己的算法。首先使用std::sort对数组进行排序,然后使用std::accumulate累积3个中间元素,然后添加第一个resp。最后一个元素:

#include <algorithm>
#include <array>
#include <iostream>
using std::array;
using std::cin;

int main() {
    std::array<unsigned long int, 5> arr;
    for(auto &el : arr){
        cin >> el;
    }

    std::sort(arr.begin(), arr.end());
    auto sum = std::accumulate(arr.begin() + 1, arr.end() - 1, 0);
    std::cout << arr[0] + sum << ' ' << arr[4] + sum;
}

答案 3 :(得分:0)

复杂度为f(O2)的简单解决方案

void miniMaxSum(vector<int> arr) {

   long long int l_lliMax = arr[0];
   long long int l_lliMin = arr[0];
   long long int l_lliSum = 0;

   for (int i = 0; i < arr.size(); ++i)
   {
       if(arr[i] > l_lliMax)
          l_lliMax = arr[i];

       if(arr[i] < l_lliMin)
          l_lliMin = arr[i];
   }

   for (int i = 0; i < arr.size(); ++i)
   {
      l_lliSum += arr[i];
   }

   cout << (l_lliSum - l_lliMax ) << " " << (l_lliSum - l_lliMin );

}