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\) 值都尽可能最大。
我们所做的所有操作都是要使 \(\max\) 值和 \(\min\) 值尽可能的大。
很容易就发现,只有 \(\max\) 值符合我们的预期。无论如何扩展区间,\(\min\) 值都只会减少,不会增加。移动区间也是。
这时我们所做的就是,用区间大小控制 \(\min\) 值,同时用区间位置控制 \(\max\) 值,这样可以保证答案最大。
所以我们的区间范围取最小,即 \(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;
}//完结撒花
posted @ 2021-07-31 11:30  joshua泷  阅读(89)  评论(0)    收藏  举报