【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
3sample output1 3 2
10hint
【樣例說明】
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 ...