NOIP複賽模擬題(一) 第2題

2021-06-28 13:26:10 字數 2499 閱讀 1358

【noip複賽模擬題(一)】【第2題】破譯密碼

time limit:1000ms  memory limit:32768k

total submit:9 accepted:5

description

破譯密碼(password.pas/c/cpp)

【題目描述】

feli得到總部發來的訊息,我軍特種部隊已經截獲敵人的乙個密碼本,但是這個密碼本本身是由密碼寫成的。為了給敵人造成沉重的打擊,feli必須盡快破譯密碼。

經過一天一夜的探索,feli發現日軍密碼本實際上記載著乙個數列,而最終密碼由這個數列經過某種運算得到。運算是這樣的:

1.把數列從小到大排序。

2.(分拆)在排好序的數列中,任選乙個數,這個數將把原數列分成左右兩個數列(選出的數不在新數列中,並且新數列有可能為空)。

3.對每個新數列進行第2步操作,直到最後得到的數列長度都為1,即全部變成單個數。

4.將第3步得到的每個數*(得到它所需的分拆次數+1),累加得到乙個和。

5.重複2,3,4操作,直到遍歷所有的分拆可能,這時,所得的和當中最小的乙個就是日軍的最終密碼。

6.現在feli請求你幫助,盡快破譯這段密碼!

input

輸入檔案password.in第一行為n,n≤1000,表示密碼本記錄的數列的長度。

下一行共有n個數,即日軍密碼本記載的數列。

output

輸出檔案password.out為乙個整數,即日軍最終密碼。

sample input

3

1 3 2

sample output

10
hint

【樣例說明】

1.數列排序得 1 2 3

2.選出乙個數 2

3.分拆得

2/ \

1 3此時新的數列(1,3)長度都已經是1,因此無須再分拆

4.求和,2*1+1*2+3*2=10(2在原數列,故乘1;1和3都經過一次分拆,故乘2)

2.選出乙個數 1

3.分拆得1\

2 32 3中選乙個數 2,分拆得1\

2\34.求和,1*1+2*2+3*3=14

…………

所有和當中最小的是10,故輸出10

source

開始還以為是樹形動歸,所以就直接搜了。

其實就是個區間動歸。其中要用到「四邊形不等式

」。

具體我也不懂。。

varn:longint;

a:array[0..1000+1]of longint;

f,q,w:array[0..1000+1,0..1000+1]of longint;

procedure init;

vari,j:longint;

begin

read(n);

for i:=1 to n do read(a[i]);

for i:=1 to n-1 do

for j:=i+1 to n do

if a[i]>a[j] then begin a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0]; end;

end;

procedure main;

vari,j,k,l,minl,min:longint;

begin

for i:=1 to n do w[i,i]:=a[i];

for i:=1 to n-1 do

for j:=i+1 to n do

w[i,j]:=w[i,j-1]+a[j];

for i:=1 to n do f[i,i]:=a[i];

for i:=1 to n do q[i,i]:=i;

for k:=2 to n do

for i:=1 to n-k+1 do

begin

j:=i+k-1;

min:=maxlongint;

for l:=q[i,j-1] to q[i+1,j] do

if f[i,l-1]+f[l+1,j]

begin

min:=f[i,l-1]+f[l+1,j];

minl:=l;

end;

f[i,j]:=min+w[i,j];

q[i,j]:=minl;

end;

write(f[1,n]);

end;

begin

assign(input,'password.in');

assign(output,'password.out');

reset(input);

rewrite(output);

init;

main;

close(input);

close(output);

end.

NOIP普及組複賽題集

題目描述 牛倌被通知,他的乙隻牛逃逸了!所以他決定,馬上出發,盡快把那只牛抓回來 他們都站在數軸上 牛倌在n 0 n 100000 處,牛在k 0 k 100000 處 約翰有兩種辦法移動,步行和瞬移 步行每秒種可以讓約翰從x處走到x l或x l處 而瞬移則可讓他在1秒內從x處消失,在2x處出現 然...

玩具(普及組複賽模擬題)

問題描述 有一種玩具,在玩具上有乙個紅色按鈕,乙個黃色按鈕和一萬個能坐能站的小木偶,按一次紅色的按鈕,就會有乙個站著的小木偶坐下去,按一次黃色按鈕,就可以使站著的小木偶增加一倍。開始時有三個小木偶站著,要想使站著的小木偶增加到n個,最少按幾次按鈕就行了?請編一程式,由鍵盤輸入n輸出最少按的次數。輸入...

NOIP模擬題 連通

給定乙個無向圖,請編寫乙個程式實現以下兩種操作 1 d x y,從原圖中刪除連線x和y頂點的邊。2 q x y,詢問x和y頂點是否連通。這也是連通問題,考慮用並查集解決。但是這是刪除的問題耶,怎麼辦?考慮將刪除變為連通,能不能將所有操作給反過來,從最後乙個操作開始處理。當然是可以的。include ...