Codeforces Round #440 B. Maximum of Maximums of Minimums-【思维】

来源:互联网 发布:邻里中国网php面试题 编辑:程序博客网 时间:2024/05/29 04:38

传送门:http://codeforces.com/contest/872/problem/B


B. 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 and k (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 integersa1,  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 ofn 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 aremin(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个子序列 ( 可以不等分 ) ,每个子序列都选出一个最小值,然后求这些最小值的最大值为多少。

解题:k  =  1 取整个数组最小值

           k  =  2 取数组头和尾的最大值  两个区间,想要最优,从第一个和最后一个选一个最大的因为不管在哪分都不会比两端的大
           k >=  3 取整个数组最大的——分3段 把最大值那个单分出来

#include<cstdio>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;int num[100010];int main(){int n,k;//scanf("%d%d",&n,&k); while(scanf("%d%d",&n,&k)!=EOF){int minn=INF,maxx=-INF;for(int i = 0; i < n; i++){scanf("%d",&num[i]);minn=min(minn,num[i]);maxx=max(maxx,num[i]);}if(k == 1)printf("%d\n",minn);if(k == 2)printf("%d\n",max(num[0],num[n-1]));//两个区间,想要最优,从第一个和最后一个选一个最大的 if(k >= 3)//因为不管在哪分都不会比两端的大 printf("%d\n",maxx);}return 0;}



阅读全文
0 0