給定乙個陣列序列, 需要求選出乙個區間, 使得該區間是所有區間中經過如下計算的值最大的乙個:比較暴力的方法,固定i,先i的左邊遍歷,查詢比它大的數,遇到比它小的退出,向右同理。區間中的最小數 * 區間所有數的和最後程式輸出經過計算後的最大值即可,不需要輸出具體的區間。如給定序列 [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:輸出陣列經過計算後的最大值。
輸出例子1:3
6 2 1
36
因為容易證明將大的數加到區間中,最小的數沒有變,都是i,所以區間越大則最後的結果就越大
#include#include#include#include#includeusing namespace std;
int main()
// to right
j = i + 1;
while (j< n && array[j]>= array[i])
if (result < sum * array[i])
result = sum * array[i];
} cout << result << endl;
return 0;
}
牛客網程式設計題
參考了排行榜大神 1.計算字串最後乙個單詞的長度,單詞以空格隔開 a raw input b a.split print len b 1 2.寫出乙個程式,接受乙個有字母和數字以及空格組成的字串,和乙個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫 a raw input lower b r...
牛客網程式設計2
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1 是該壓棧序列對應的乙個彈出序列,但 4,3,5,1,2 就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的...
牛客網程式設計題1
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。思路 本題最初想簡單的求模算出等於1的位數,但是發現負數不行。其實簡單的做法應該是與 1相與,如果為 1,則原來為 1,迴圈移位判斷。但注意,要左移,要是右移,對於負數會一直在高位補 1,導致結果不準確。class solution ...