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;
}//完结撒花

浙公网安备 33010602011771号