Codeforce - 872 - B. Maximum of Maximums of Minimums 思路好题

Maximum of Maximums of Minimums

You are given an array a1, a2, ..., an consisting of n integers, and an integer k. You have to split the array into exactly k non-empty subsegments. You'll then compute the minimum integer on each subsegment, and take the maximum integer over the kobtained minimums. What is the maximum possible integer you can get?

Definitions of subsegment and array splitting are given in notes.

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤  105) — the size of the array a and the number of subsegments you have to split the array to.

The second line contains n integers a1,  a2,  ...,  an ( - 109  ≤  ai ≤  109).

Output

Print single integer — the maximum possible integer you can get if you split the array into k non-empty subsegments and take maximum of minimums on the subsegments.

Examples

Input

5 2
1 2 3 4 5

Output

5

Input

5 1
-4 -5 -3 -2 -1

Output

-5

Note

A subsegment [l,  r] (l ≤ r) of array a is the sequence al,  al + 1,  ...,  ar.

Splitting of array a of n elements into k subsegments [l1, r1], [l2, r2], ..., [lk, rk](l1 = 1, rk = nli = ri - 1 + 1 for all i > 1) is k sequences (al1, ..., ar1), ..., (alk, ..., ark).

In the first example you should split the array into subsegments [1, 4] and [5, 5]that results in sequences (1, 2, 3, 4) and (5). The minimums are min(1, 2, 3, 4) = 1 and min(5) = 5. The resulting maximum is max(1, 5) = 5. It is obvious that you can't reach greater result.

In the second example the only option you have is to split the array into one subsegment [1, 5], that results in one sequence ( - 4,  - 5,  - 3,  - 2,  - 1). The only minimum is min( - 4,  - 5,  - 3,  - 2,  - 1) =  - 5. The resulting maximum is  - 5.

 

思路:显然要得到最大值,那么我们让最大值单独成一份就好了。也就是说只要k≥3,我们总是令最大值单独成一份,其他随意分,就可以得到最大值,并且这个最大值就是它,如果k=2,那么结果就是max(array[0],array[n-1]),我们这样考虑,假设数组为,a1,a2,a3,a4,a5, 首先我们让a1为单独一份,a2~a5为一份,然后如果a2比a1大的话,显然不能和a1一组,因为这样可能会降低第二份的最小值,如果a2比a1小的话,也不能和a1一组,因为会降低第一组的最小值,反之a1~a4一组,a5一组,一样可以这样考虑,所以最后的最大值,就是max(array[0],array[n-1])

废话不多说直接上代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int n,k,a[100000+5];
	cin>>n>>k;
	int maxx=-0x3f3f3f3f,minn=0x3f3f3f3f;
	for(int i=0;i<n;i++){
		cin>>a[i];
		maxx=max(a[i],maxx);
		minn=min(a[i],minn);
	} 
	if(k==1) cout<<minn<<endl;
	else if(k==2) cout<<max(a[0],a[n-1])<<endl;
	else cout<<maxx<<endl; 
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值