【刷題】字節跳動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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM