筆試刷題 頭條

2021-08-21 08:00:20 字數 1482 閱讀 5826

題目描述:

/**

給定乙個陣列序列, 需要求選出乙個區間,

使得該區間是所有區間中經過如下計算的值最大的乙個:

區間中的最小數 * 區間所有數的和最後程式輸出經過計算後的最大值即可,

不需要輸出具體的區間。

如給定序列 [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:

36 2 1

輸出例子1:

36*/

思路如下:

類似柱狀圖擴充套件長方形求最大面積即可

用棧更新乙個點可以向左擴充套件到**,向右可以擴充套件到**

然後用計算累加和即可

**如下:

#include#include#include#define max_n 500005

using namespace std;

int val[max_n], accsum[max_n];

int leftnum[max_n], rightnum[max_n];

int main()

//用棧構建left right

stackst;

//建立left

for(int i=1; i<=n; i++)

if(st.empty())

else

st.push(i);}}

//清空

while(!st.empty())

//建立right

for(int i=n; i>=1; i--)

if(st.empty())

else

st.push(i);}}

// for(int i=1; i<=n; i++)

// printf("\n");

// for(int i=1; i<=n; i++)

// printf("\n");

int res=0;

for(int i=1; i<=n; i++)

printf("%d", res);

return 0;

}

筆試刷題 頭條

題目介紹 作為乙個手串藝人,有金主向你訂購了一條包含n個雜色串珠的手串 每個串珠要麼無色,要麼塗了若干種顏色。為了使手串的色彩看起來不那麼單調,金主要求,手串上的任意一種顏色 不包含無色 在任意連續的m個串珠裡至多出現一次 注意這裡手串是乙個環形 手串上的顏色一共有c種。現在按順時針序告訴你n個串珠...

今日頭條筆試

問題描述 給定乙個段落,由 n 個句子組成。第 i 個句子的長度為 l i 包含的單詞個數為 w i 句子不包含任何除字母和空格 外的符號。每個句子內部,含有若干個單詞,由空格 分隔。句子不會包含連續的空格。隨後給定 m 個查詢,每個查詢包含乙個句子,需要在段落中尋找相同單詞數量最多的句子。重複的單...

2017 08 22 今日頭條筆試題

有乙個值得分享的地方,是x排序之後對應y的問題 我用了乙個很大的陣列,以x為索引,y為陣列值,不需要用到map。其實也是因為我懶不想去學map操作了,下次試試用map。include include include using namespace std int main cin n x.clear...