zoukankan      html  css  js  c++  java
  • 【刷题】字节跳动2018算法笔试第二题

    时间限制:3秒 空间限制:131072K

    给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:

    区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

    [6] = 6 * 6 = 36;

    [2] = 2 * 2 = 4;

    [1] = 1 * 1 = 1;

    [6,2] = 2 * 8 = 16;

    [2,1] = 1 * 3 = 3;

    [6, 2, 1] = 1 * 9 = 9;

    从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。

    区间内的所有数字都在[0, 100]的范围内;

    输入描述:
    第一行输入数组序列长度n,第二行输入数组序列。
    对于 50%的数据, 1 <= n <= 10000;
    对于 100%的数据, 1 <= n <= 500000;

    输出描述:
    输出数组经过计算后的最大值。

    输入例子1:
    3
    6 2 1

    输出例子1:
    36

    思路:
    每个元素都可能是某个或多个区间的最小值,所以当最小值确定的时候,区间越大越好,可以固定每个最小值,然后找区间左边界和右边界,

    #include<iostream>
    #include<vector>
    #include<limits.h>
    #include<algorithm>
    using namespace std;
    int main(){
        int n;
        cin>>n;
        vector<int> nums(n);
        for(int i=0; i<n; i++) cin>>nums[i];
        // 每次假设当前为最小
        int cur_max = -1;
        for(int i=0; i<n; i++){
            // 假设nums[i]是某个区间的最小值,那么这个区间应该越大越好,所以可以来找区间的左边界和右边界
            int l=i;
            while(l>=0 && nums[l]>=nums[i]) l--;
            int r = i;
            while(r<n && nums[r]>=nums[i]) r++;
            int sum = accumulate(nums.begin()+l+1, nums.begin()+r, 0);
            cur_max = max(cur_max, sum*nums[i]);
        }
        cout<<cur_max<<endl;
        return 0;
    }
    
  • 相关阅读:
    使用C语言生成任意指定长度的一串随机数
    拷贝ssh公钥到 authorized_keys 后仍然无法免密登录的原因记录
    vs2013 远程调试---笔记
    C++ 根据进程名找到对应Pid
    使用C语言判断一个IP 地址是否为私有地址
    WEB后台传数据给前台
    邮箱跳转
    Cookie记住密码
    Linux服务器攻击防御(转)
    APACHE两种域名跳转法简单完成重定向
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/11210621.html
Copyright © 2011-2022 走看看