CF1554A Cherry 题解

又是一道十分经典的贪心

亲爱的题目在这里

题目(已翻译)

给 \(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;
}//完结撒花
上一篇:标量对矩阵求导


下一篇:CF679div.2