题目描述:
题目解读:
给定数组,数有正负,输出其中两个数的乘积的最大值。
解题思路:
英文描述里其实有暗示,要“remove some elements”。
对输入的数组进行排序,然后比较a[1]*a[2] 和 a[i-2]*a[i-1]哪个更大即可。
代码实现:
冒泡排序,时间超了
//输出乘积最大值
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAX 1000
#define ll long long
void Sort(ll* a, int len){
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (a[j + 1] < a[j])
{
ll temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
void Solve() {
int n;
scanf("%d", &n);
ll a[MAX];
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
Sort(a,n);
printf("%lld\n", (a[0] * a[1] > a[n - 1] * a[n - 2] ? a[0] * a[1] : a[n - 1] * a[n - 2]));
return;
}
int main() {
int t;
scanf("%d", &t);
while (t--) Solve();
}
使用 c++标准库里的sort()排序函数:
//输出乘积最大值
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <bits/stdc++.h>
#define MAX 200000
#define ll long long
using namespace std;
void Solve() {
int n;
scanf("%d", &n);
ll a[MAX];
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
sort(a,a+n);
printf("%lld\n", (a[0] * a[1] > a[n - 1] * a[n - 2] ? a[0] * a[1] : a[n - 1] * a[n - 2]));
return;
}
int main() {
int t;
scanf("%d", &t);
while (t--) Solve();
}
遇到的错误:
排序算法不会写!!!
输入最高达10^9次方,注意使用long long型,这里定义数组时就定义为long long型了。
总结排序算法