CF1554A - Cherry(贪心+入门级)

CF1554A - Cherry(源地址自⇔CF1554A

Problem

uTools_1633488130269.png

Example

4
3
2 4 3
4
3 2 3 1
2
69 69
6
719313 273225 402638 473783 804745 323328
12
6
4761
381274500335

uTools_1633488225571.png

tag:

⇔贪心、⇔入门级(*800)

题意:

给定数组 \(a\),对于所有满足条件的 \(1\leq l<r\leq n\) ,计算 \(max(a_l,a_{l+1},…,a_r)*min(a_l,a_{l+1},…,a_r)\) 的最大值。

思路:

首先考虑特殊化:对于长度为3的数组 \(\{a_1,a_2,a_3\}\) ,其最小值必定来自于其长度为2 的子数组 \(\{a_1,a_2\}\) 以及 \(\{a_2,a_3\}\)。用更数学的语言而言,\(min(a_1,a_2,a_3)\leq min(\ min(a_1,a_2)\ ,\ min(a_2,a_3)\ )\) 。最大值同理。故题目转化为计算 \(max(\ min(a_1,a_2)*max(a_1,a_2)\ ,\ min(a_2,a_3)*max(a_2,a_3)\ )\),即计算 \(max(a_1*a_2,a_2*a_3)\)

再考虑一般化:对于满足条件的数组 \(\{a_l,a_{l+1},…,a_{r-1},a_r\}\) ,其最大最小值也必定来自于其子数组。故题目转化为求解 \(max(a_l*a_{l+1},…,a_{r-1}*a_r\)

uTools_1633489547547.png

AC代码:

//A WIDA Project
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
long long T,n,ans,a[MAX];
int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>T;
	while(T-->0){
		ans=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=2;i<=n;i++){
			ans=max(ans,a[i-1]*a[i]);
		}
		cout<<ans<<"\n";
	}
	return 0;
}

错误次数:0次


文 / WIDA
2021.10.06成文
首发于WIDA个人博客,仅供学习讨论


更新日记:
2021.10.06 成文

posted @ 2021-10-06 11:07  hh2048  阅读(57)  评论(0编辑  收藏  举报