對於乙個給定的序列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操作變成乙個元素的最小代價。3123
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...