给出五个正整数,找到可以通过对五个整数中的四个精确求和而得出的最小值和最大值。然后将相应的最小值和最大值打印为两个空格分隔的长整数的单行。
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)时,它表示测试用例失败了。我不知道为什么,有人可以帮我吗?
答案 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 );
}