如何找到给定数组中数字之间的最大乘法(限制为 100000 个数字)
how to find the biggest multiplication between numbers in a given array(limit is 100000 numbers)
我正在尝试学习编程,在我们学校,我们有由机器人自动检查的练习。时间限制为 1 秒,内存限制为 1024 MB。
我试过按升序对数组进行排序,然后将 2 个最高的数字相乘,但这太慢了(我的排序算法可能很慢,所以如果可能的话建议一个排序算法。)
这是我能做到的最快的方法:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int Maksimumas(int n, int X[]);
ofstream fr("U1rez.txt");
ifstream fd("U1.txt");
int main()
{
int n, A[100000], B[100000], maxi=0;
fd >> n;
for (int i = 0; i < n; i++) {
fd >> A[i];
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
B[j] = A[i] * A[j];
}
maxi = Maksimumas(n, B);
A[i] = B[maxi];
}
maxi = Maksimumas(n, A);
fr << A[maxi];
fr.close();
return 0;
}
int Maksimumas(int n, int X[])
{
int maxi = 0;
for (int i = 0; i < n; i++) {
if (X[maxi] < X[i]) {
maxi = i;
}
}
return maxi;
}
n 是任何想知道的数组的大小。
您不需要对整个数组进行排序 - 您只需要两个最大的正数和两个最小的负数。中间的一切都是无关紧要的。
相反,您可以遍历所有输入并跟踪两个最大的正数和两个最小的负数。在迭代结束时,将每对(如果找到)相乘,然后比较结果。
// fd is opened like the original question, n is the number of elements to read
// that part is omitted for brevity
int max = -1;
int preMax = -1;
int min = 1;
int preMin = 1;
int temp;
for (int i = 0; i < n; i++) {
fd >> temp;
if (temp > preMax) {
if (temp > max) {
preMax = max;
max = temp;
} else {
preMax = temp;
}
} else if (temp < preMin) {
if (temp < min) {
preMin = min;
min = temp;
} else {
preMin = temp;
}
}
}
int result = -1;
if (preMax >= 0) {
result = preMax * max;
}
if (preMin <= 0) {
int tempResult = preMin * min;
if (tempResult > result) {
result = tempResult;
}
}
return result;
我正在尝试学习编程,在我们学校,我们有由机器人自动检查的练习。时间限制为 1 秒,内存限制为 1024 MB。 我试过按升序对数组进行排序,然后将 2 个最高的数字相乘,但这太慢了(我的排序算法可能很慢,所以如果可能的话建议一个排序算法。) 这是我能做到的最快的方法:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int Maksimumas(int n, int X[]);
ofstream fr("U1rez.txt");
ifstream fd("U1.txt");
int main()
{
int n, A[100000], B[100000], maxi=0;
fd >> n;
for (int i = 0; i < n; i++) {
fd >> A[i];
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
B[j] = A[i] * A[j];
}
maxi = Maksimumas(n, B);
A[i] = B[maxi];
}
maxi = Maksimumas(n, A);
fr << A[maxi];
fr.close();
return 0;
}
int Maksimumas(int n, int X[])
{
int maxi = 0;
for (int i = 0; i < n; i++) {
if (X[maxi] < X[i]) {
maxi = i;
}
}
return maxi;
}
n 是任何想知道的数组的大小。
您不需要对整个数组进行排序 - 您只需要两个最大的正数和两个最小的负数。中间的一切都是无关紧要的。
相反,您可以遍历所有输入并跟踪两个最大的正数和两个最小的负数。在迭代结束时,将每对(如果找到)相乘,然后比较结果。
// fd is opened like the original question, n is the number of elements to read
// that part is omitted for brevity
int max = -1;
int preMax = -1;
int min = 1;
int preMin = 1;
int temp;
for (int i = 0; i < n; i++) {
fd >> temp;
if (temp > preMax) {
if (temp > max) {
preMax = max;
max = temp;
} else {
preMax = temp;
}
} else if (temp < preMin) {
if (temp < min) {
preMin = min;
min = temp;
} else {
preMin = temp;
}
}
}
int result = -1;
if (preMax >= 0) {
result = preMax * max;
}
if (preMin <= 0) {
int tempResult = preMin * min;
if (tempResult > result) {
result = tempResult;
}
}
return result;