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;
    }
    
  • 相关阅读:
    Json对象和Json字符串
    主界面的构造函数报错
    WPF DataGrid绑定的数据源更新后界面信息不更新
    WPF 数据绑定 ( 经验 )
    WPF 简单快速地去掉Button控件的边框
    字节数组与字符串形式的数字(序列号)之间的相互转换
    将十进制数字转换为字节数组
    WPF 调用线程无法访问此对象,因为另一个线程拥有该对象。
    cmd中一些命令
    Notepad++运行快捷键的设置
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/11210621.html
Copyright © 2011-2022 走看看