模拟题,对几种情况进行分类讨论
对于数据小的情况下直接暴力模拟 数据大的情况下枚举中间点进行交换
if (i - 1 >= 0) ans = max(ans, (long long)a[i] * a[i - 1]);
if (i - 2 >= 0) ans = max(ans, (long long)a[i] * a[i - 2]);
if (i + 1 < n) ans = max(ans, (long long)a[i] * a[i + 1]);
if (i + 2 < n) ans = max(ans, (long long)a[i] * a[i + 2]);
#include <bits/stdc++.h>
using namespace std;
long long cal(vector<int> a)
{
long long res = 0;
for (int i = 0; i + 1 < a.size(); i++)
{
res = max(res, (long long)a[i] * a[i + 1]);
}
return res;
}
int main()
{
int n;
cin >> n;
vector<int> a(n);
for (int& t : a) cin >> t;
long long ans = 0;
if (n <= 4)
{
for (int i = 0; i + 1 < n; i++)
{
swap(a[i], a[i + 1]);
ans = max(ans, cal(a));
swap(a[i], a[i + 1]);
}
}
else
{
for (int i = 0; i < n; i++)
{
if (i - 1 >= 0) ans = max(ans, (long long)a[i] * a[i - 1]);
if (i - 2 >= 0) ans = max(ans, (long long)a[i] * a[i - 2]);
if (i + 1 < n) ans = max(ans, (long long)a[i] * a[i + 1]);
if (i + 2 < n) ans = max(ans, (long long)a[i] * a[i + 2]);
}
}
cout << ans << endl;
return 0;
}
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=sc.nextInt();
}
long res = Long.MIN_VALUE;
for (int i = 0; i < n - 1; i++) {
res = Math.max(res,(long)nums[i] * nums[i + 1]);
}
for (int i = 0; i < n - 2; i++) {
res = Math.max(res,(long) nums[i] * nums[i + 2]);
}
System.out.println(res);
}
}
n = int(input())
a = list(map(int, input().split()))
ans = 0
for i in range(n):
if i + 1 < n:
ans = max(ans, a[i] * a[i + 1])
if i + 2 < n:
ans = max(ans, a[i] * a[i + 2])
if i - 1 >= 0:
ans = max(ans, a[i] * a[i - 1])
if i - 2 >= 0:
ans = max(ans, a[i] * a[i - 2])
print(ans)
米小游有一个长度为 n 的数组,其中第 i 个元素为 ai。现在定义数组的价值是最大的相邻数字的乘积。例如,数组为 [3,5,1,2],相邻元素的乘积分别是 3×5=15、5×1=5 和 1×2=2,则数组的价值是这些数字中的最大值,即 15。
现在米小游想要任选数组中的某两个相邻的元素进行交换(你必须使用这次交换机会),他想知道最大可以将数组的价值更改为多少?
第一行一个整数 n,表示数组长度。 接下来一行 n 个整数 a1,a2,a3⋯an 表示数组 a。
一行一个整数表示答案。
3
3 1 10
30
对于 100% 的数据,满足 2≤n≤105,1≤ai≤105。