CF 440 div2 B.Maximum of Maximums of Minimums

来源:互联网 发布:建站如何买域名和空间 编辑:程序博客网 时间:2024/06/09 17:16
Maximum of Maximums of Minimums
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given an array a1, a2, ..., an consisting ofn 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 thek obtained 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 andk (1 ≤ k ≤ n ≤  105) — the size of the arraya 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 intok non-empty subsegments and take maximum of minimums on the subsegments.

Examples
Input
5 21 2 3 4 5
Output
5
Input
5 1-4 -5 -3 -2 -1
Output
-5
Note

A subsegment [l,  r] (l ≤ r) of arraya 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 = n,li = ri - 1 + 1 for alli > 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 ismax(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.


题意:给出n个数,分成k段,每一段取最小值,再从k个最小值中取最大值,问能取到的最大数是多少。

思路:如果能分成3段以上,可以将n个最大数的最大值单独划分成一段,最后答案就是最大值,如果只能分成一段,肯定输出的就是最小值,如果只能分成两段,如果全局最大值在两端,那么能把最大值单独划分成一段,直接输出最大值,如果最大值不在两端,每段的最小值肯定取不到最大值,那么答案肯定取不到最大值,能最到到比较大的数最好的方案就是把端点单独划分,哪个端点大输出哪个.



#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <queue>#include <algorithm>#define inf 0x3f3f3f3fusing namespace std;int s[110000];int main(){ios::sync_with_stdio(false);int Max, Min;int n, k;int i;cin>>n>>k;Max = -inf;Min = inf;for(i = 0;i < n;i++){cin>>s[i];Max = max(s[i],Max);Min = min(s[i],Min);}if(k == 1)cout<<Min<<endl;else if(k == 2){if(Max == s[0] || Max == s[n-1])cout<<Max<<endl;else{Max = max(s[0],s[n-1]);cout<<Max<<endl;}}elsecout<<Max<<endl;return 0;}


阅读全文
0 0
原创粉丝点击