題目描述:
/**
給定乙個陣列序列, 需要求選出乙個區間,
使得該區間是所有區間中經過如下計算的值最大的乙個:
區間中的最小數 * 區間所有數的和最後程式輸出經過計算後的最大值即可,
不需要輸出具體的區間。
如給定序列 [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...