ACM 線性 字首和 字尾和

2021-09-26 05:41:14 字數 2584 閱讀 5494

​題目描述:2015 年 uoi 馬上就要開始了,cssyz2015 資訊隊派出最強三位同學組成「宇宙隊」參加這次 acm 比賽,周老師想讓他們以最優的策略去完成比賽,於是,將題目分為 5 等,編號 1 到 5,數字越大,難度越大。對於每乙個同學,同一道題可能難度不一樣,現在,周老師想知道,如何安排學生做題順序,能使難度值總和最低。注意:每位同學只能做編號連續的題目,並且不能一道題不做。

輸入

第一行乙個整數 n(3<=n<=150000),為題目數量。

第二行到第四行,每行 n 個整數,代表每個題目對於三名同學的難度。

輸出

一行,最小難度總和。

樣例輸入1

31 3 3

1 1 1

1 2 3

樣例輸入2

73 3 4 1 3 4 4

4 2 5 1 5 5 4

5 5 1 3 4 4 4

樣例輸出1

4樣例輸出2

19題目思路

首先大家都能夠想到這道題能轉化。因為每個人至少做一道題,且做的題目編號要連續 (這個編號不是難度編號,是輸入順序的編號。別問我怎麼知道的,我是不會告訴你我因這個細節wa了無數次的)。所以,我們就能知道有乙個人做了從第乙個題開始的若干個題,還有乙個人做了以最後一道題結尾的若干個題,剩下的就是第三個人做了。

畫張圖形象的描述一下。

//圖所以我們發現,題目被i和j(i+1接下來就可以暴搜了!!! 望了一眼資料,本以為已經取得勝利的我,原來還在起跑線上。

既然暴力不行,就試試其他辦法,再仔細看看我們目前的線索,有乙個點十分引人注目:有乙個人做了從第乙個題開始的若干個題,還有乙個人做了以最後一道題結尾的若干個題。

左青龍,右白虎,前朱雀,後玄武,中間乙個250.

呸!呸!乙個在前,乙個在後。可以用字首和與字尾和來優化呀!

然後我們就可以驚奇的發現,沒有用。

但是我們得到乙個結論:我們需要從兩邊進行考慮。這時,我們就可以假設左邊第一塊題為0,右邊第一塊也為0,也就是中間那個人需要寫所有的題目,但是其他人也要寫題啊,所以就可以開始擴充套件。

ans(難度和) a[ i ] (對於第1個人來說第i道題的難度)

b [ i ] (對於第2個人來說第i道題的難度)

c [ i ] (對於第3個人來說第i道題的難度)

那麼,未擴充套件前,ans=b[1]+b[2]+…+b[n];

如果要將前i道題給第乙個人做,那麼第1 ~ i道題的難度就由b[1 ~ i]變為a[1~i]。

所以可得出ans=b[1]+b[2]+…+b[n]+(a[1]-b[1])+(a[2]-b[2])+…+(a[i]-b[i]);

同理,如果要將後j道題給第三個人做,那麼第j~n道題的難度就由b[j~n]變為了c[j~n];

所以在上述的情況下可得出結論ans=b[1]+b[2]+…+b[n]+(a[1]-b[1])+(a[2]-b[2])+…+(a[i]-b[i])+(c[j]-b[j])+(c[j+1]-b[j+1])+…+(c[n]-b[n]);

我們再用用字首和與字尾和優化一下,定義兩個陣列。

f [i] (a[1~i]-b[1~i]的和) g [j] (c[j~n]-b[j~n]的和)

最終,ans=b[1~n]+(f [i]+g [j]);(i+1也就是說,我們要使ans最小,就要讓b[1~n]+(f [i]+g [j])最小,但是b[1~n]是一直不會改變的,所以只要使f [i]+g [j]最小就行了。

然後,我們就又能夠驚奇的發現,這還不是找i和j嗎?不還是o(n*n)的複雜度嗎?

別著急,我們可以只列舉j,而i這樣,列舉j,ans=min(ans, b[1~n]+(x[j-2]+g[j]));

這樣就可以簡簡單單 地a掉這道題了。

**如下:

#include

#define r register int

using

namespace std;

int ans=

1000000007

, n;

int pos[4]

[150005];

int f[

150005];

int g[

150005];

int m[4]

;void

work

(int a,

int b,

int c)

int main (

)work(1

,2,3

);work(1

,3,2

);work(2

,1,3

);work(2

,3,1

);work(3

,1,2

);work(3

,2,1

);printf

("%d\n"

, ans)

;return0;

}

謝謝**,蒟蒻有不對的地方,還請多多指教。

745 字首和字尾搜尋

給定多個words,words i 的權重為i。設計乙個類wordfilter實現函式wordfilter.f string prefix,string suffix 這個函式將返回具有字首prefix和字尾suffix的詞的最大權重。如果沒有這樣的詞,返回 1。例子 輸入 wordfilter.f...

中綴轉字尾和字首

中綴轉字尾 include using namespace std bool isoperator char ch intgetpriority char ch return level string postorder void trans string inorder s.pop else el...

關於英語字首和字尾的區別

典型的前字尾應用舉例 1 excite vt.刺激 exciting adj.令人興奮的 excited adj.感到興奮的 excitement n.興奮 2 smile v.n.微笑 smiling adj.微笑的 smilingly adv.微笑的 unsmiling adj.不笑的 字首改變...