2620 序列問題 (序列合併問題 兩兩相鄰)

2021-09-26 03:42:59 字數 1783 閱讀 3404

對於乙個給定的序列a1,a2...ana1,a2...an,我們對它進行乙個操作reduce(i)reduce(i),

該操作將數列中的元素aiai和ai+1ai+1用乙個元素max(aiai,ai+1ai+1)替代,這樣得到一

個比原來序列短的新序列。這一操作的代價是max(aiai,ai+1ai+1)。進行n-1次該操作後,

可以得到乙個長度為1的序列。我們的任務是計算代價最小的reduce操作順序,將給定

的序列變成長度為1的序列。

例如a序列為:1,2,3

那麼最優的reduce順序為:

首先1,2合併花費為2,序列變為2,3

2,3合併,花費為3,序列變為3,長度為1。

所以答案為5。

第1行:乙個整數n表示給定序列的長度。(1 <= n <= 1,000,000 )

第2到n+1行:每行乙個整數a[i]表示序列中的元素。(0 <=a[i]<= 1, 000, 000, 000)

輸出乙個整數表示將序列通過reduce操作變成乙個元素的最小代價。
312

3

5
19寒假好像做過乙個類似的題,沒啥印象了.

這題直接考慮了單調性,然後單調棧更新答案,實際上

進一步考慮,只要相鄰兩個元素(n-1個數對)選大者加入答

案即可。

#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

#define ull unsigned long long

/*#ifdef myhome

freopen("input.txt", "r", stdin);

#endif*/

using namespace std;

const int n = 4e5 + 100;

const int m = 4e5 + 100;

int arr[n];

int main()

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

cout << ans << endl;

} return 0;

}

#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

#define ull unsigned long long

/*#ifdef myhome

freopen("input.txt", "r", stdin);

#endif*/

using namespace std;

const int n = 4e5 + 100;

const int m = 4e5 + 100;

int arr[n], sc[n],top;

int main()

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

top-- ;

while (top > 0)

cout << ans << endl;

} return 0;

}

the end;

2序列比對問題

str1 abdad str2 bacd 兩字串進行序列比對,定義乙個可以用來衡量比對效能的得分函式 令f x,y 表示x與y比對的得分。假設x和y都是字元,如果x與y相同,那麼f x,y 2,如果x與y不同,那麼f x,y 1,如果x或y是 那麼f x,y 1。str1和str2的2序列比對問題是...

問題 B 序列合併

題目描述 有兩個長度都為n的序列a和b,在a和b中各取乙個數相加可以得到n2個和,求這n2個和中最小的n個。輸入第一行乙個正整數n 1 n 100000 第二行n個整數ai,滿足ai ai 1且ai 109 第三行n個整數bi,滿足bi bi 1且bi 109 輸出輸出僅有一行,包含n個整數,從小到...

bzoj1345 序列問題

記每乙個數向比他大的數合併時的代價為這個數字的代價,顯然除了最大值以外,每乙個數都有乙個代價,那麼這個代價和就是最終答案 考慮最小化這個代價和,也就是讓每乙個數的代價最小,顯然這個代價不會小於向左和右第乙個比他大的數中較小的數,然後這樣的方案也很好構造,這個東西用單調棧來處理即可 1 include...