zoukankan      html  css  js  c++  java
  • codeforces Round #440 B Maximum of Maximums of Minimums【思维/找规律】

    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 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 k 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 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 ksequences (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个区间里的最小值。

    【分析】:观察,发现最大化的值和k有关。

    【代码】:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n,k;
    const int maxn = 1e5+10;
    int a[maxn];
    #define inf 0x3f3f3f3f
    int main()
    {
        int mm,ma;
        memset(a,0,sizeof(a));
        while(cin>>n>>k)
        {
            mm=inf;
            ma=-inf;
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                mm=min(mm,a[i]);
                ma=max(ma,a[i]);
            }
            if(k==1)
            {
                cout<<mm<<endl;
                return 0;
            }
            if(k>2)//分割大于2时,最大化策略为总把最大值划为单独,就可以最大化结果刚好为最大值
            {
                cout<<ma<<endl;
                return 0;
            }
            if(k==2)//分割为2个区间时,想要最大化,策略1 5 9 7 2/9 5 1 7 8可以试试,无论在哪里隔板,肯定符合两端的最大值。
            {
                cout<<max(a[0],a[n-1])<<endl;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    c语言中重要函数
    python 类属性、对象属性
    windows下PIP安装模块编码错误解决
    python爬取百思不得姐视频
    ubuntu下刷新dns
    pycharm设置安装python第三方插件
    python将str转换成字典
    pyqt加载图片
    Python端口扫描器
    自己构造用于异步请求的JSON数据
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7675233.html
Copyright © 2011-2022 走看看