又是一道十分经典的贪心
亲爱的题目在这里
题目(已翻译)
给 \(n\) 个整数 \(a_1,a_2,\cdots,a_n\) ,求 \(\max(a_l,a_{l+1},\cdots,a_r)\cdot\min(a_l,a_{l+1},\cdots,a_r)\) 的最大值
输入
第一行包含一个整数 \(t\)(测试用例数)。
每个测试用例的第一行包含一个整数 \(n\)。
每个测试用例的第二行包含 \(n\) 个整数 \(a_1,a_2,\cdots,a_n\)。
输出
对于每个测试用例,输出其最大可能值。
样例输入
4
3
2 4 3
4
3 2 3 1
2
69 69
6
719313 273225 402638 473783 804745 323328
样例输出
12
6
4761
381274500335
数据约定
\(1\leqslant t\leqslant 10^4\),\(2\leqslant n\leqslant 10^5\)。
保证总和 n 在所有测试用例中不超过 \(3 \cdot 10^5\) 。
这道题的总体思路是这样的
我们要找到整个数列最大的数及其相邻两边最大的数,它们的乘积是答案
这时,有同学就要问了:为什么呢?
因为找到了最大的那个,在包含它的区间里,\(max\) 值肯定是它自己
但是在左右的区间里,区间范围再大,\(min\) 的值都只会减少不会增加
所以我们的区间范围取最小,即 \(2\),就可以保证答案最大了
放上拙劣的代码
#include<bits/stdc++.h>//万能头文件
using namespace std;
typedef long long ll;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
int n,a[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//关闭同步流,加速
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ll ans=-INF;
for(int i=1;i<n;i++)
ans=max(ans,1ll*a[i]*a[i+1]);
cout<<ans<<"\n";
}
return 0;
}//完结撒花