1.
題目2.
開發計畫
(plan.pas/c/cpp
)【問題描述】
dd戰隊的首領
dds最近幾天很煩惱,
dd戰隊想要繼續開發新小陸,
dds必須馬上制定出開發計畫。新小陸可開發區域位於一片沼澤地中,數目不明,
dd戰隊可以隨便選擇乙個進行開發。
dds已經得到了前往沼澤地的地圖,他可以清晰地看到自己所在的總部位於
1號已開發區域,並且知道由
1號已開發區域可以到達的每一片區域以及這些可以到達的區域可以到達的區域。這些區域包括已開發的和未開發(可開發)的,共有
n個,每乙個區域都有乙個固定編號,從
1~n;而且整個新小陸剛好有
n-1條路徑。由乙個區域到達另乙個區域需要一天,並且到達這個新的區域後不會再返回。
雖然不知道新小陸可開發區域的具體位置,但是dds
知道它們有共同的特徵:一旦進入將無路可走,即沒有新的區域可以到達。有的區域比較貧瘠,稱之為
p區域,在
p區域會因為各種問題不得不逗留一天,然後才能繼續前進;假如可開發區域也是
p區域,那麼逗留幾天顯然不是問題,
p可開發區域和其他可開發區域等價。
知道這些並不能完全解決dds
的煩惱,由於
dd戰隊的成員智商很低,到達乙個區域後不知道權衡利弊,總是隨便選擇乙個新的可以到達的區域前進,所以他們可能走了很久才到達乙個可開發區域。
dd戰隊當然想盡量節省物資,所以戰隊只能提供足夠
m天使用的物資。
dds想知道他的隊員們最不可能到達和最可能到達的可開發區域的編號,假如有多個地區情況類似,兩個答案都輸出編號最小的。
【輸入格式】
第一行三個數,n,m
,k。分別表示區域數目,物資可以承受的天數和
p區域的數目;
第二行k
個數(若
k<>0
),表示
p區域的編號;
接下來n-1
行,每行兩個數表示相連的區域的編號。
【輸出格式】
輸出兩行,第一行表示最不可能到達的可開發區域,第二行表示最可能到達的可開發區域。
【輸入樣例】
6 1 0
1 21 3
2 42 6
4 5【輸出樣例】53
【資料範圍】
20%資料:
2<=n<=20 , 2<=m<=50 , 0<=k<=5
100%資料:
2<=n<=1000, 2<=m<=1000; 0<=k<=100
【hint
】物資可以剩餘。
2. 演算法
這就是傳說中的概率型動規。
首先,當花掉
0 天物資時,在節點一的概率為一(初始化)。
同乙個節點轉移到他的不同的子節點的概率是相等的,都是這個節點的概率在初一他的子節點數。
方程有兩個參,乙個是節點編號,乙個是花掉了幾天物資,它本身存的是花掉這幾天物資,到達這一節點的概率。
然後,輸出概率最大的和最小的。
然後,讓輸出的都是葉子節點的編號。
3. 注意事項
我討厭概率!
4. **
概率動規 (lyf)
varf:array[0..1005,0..1005] of double;
a:array[0..1000,0..1000] of boolean;
b:array[0..1000,0..1000] of longint;
pp,v:array[0..1000] of boolean;
ans1,ans2,i,j,k,n,m,p,l:longint;
now,p1,p2:double;
procedure dfs(x:longint);
vari:longint;
begin
v[x]:=true;
for i:=1 to n do
if (a[x,i])and(not v[i]) then
begin
inc(b[x,0]);
b[x,b[x,0]]:=i;
dfs(i);
end;
end;
begin
assign(input,'plan.in'); reset(input);
assign(output,'plan.out'); rewrite(output);
readln(n,m,p);
for i:=1 to p do
begin
read(k);
pp[k]:=true;
end;
for i:=1 to n-1 do
begin
readln(j,k);
a[j,k]:=true;
a[k,j]:=true;
end;
dfs(1);
f[1,0]:=1;
for j:=0 to m-1 do
for i:=1 to n do
if f[i,j]>0 then
begin
k:=b[i,0];
for l:=1 to k do
if (pp[b[i,l]])and(b[b[i,l],0]<>0) then f[b[i,l],j+2]:=f[b[i,l],j+2]+f[i,j]/k else
f[b[i,l],j+1]:=f[b[i,l],j+1]+f[i,j]/k;
end;
p2:=maxlongint; p1:=0;
for j:=2 to n do
begin
now:=0;
if b[j,0]<>0 then continue;
for i:=1 to m do
now:=now+f[j,i];
if now>p1 then
begin
p1:=now;
ans1:=j;
end;
if now
begin
p2:=now;
ans2:=j;
end;
end;
writeln(ans2);
writeln(ans1);
close(input); close(output);
end.
HDOJ 2102 A計畫 解題報告
這是一道三維圖的搜尋題。中文描述,題意就不再贅述了。本題詢問勇士能否在規定時間內救走公主,因此使用寬度優先搜尋是最好的了。另外本題是三維圖,第三維也只有兩種情況,因此每個節點可供搜尋的鄰節點也不多。注意 1.遇到 時空穿梭機必定會傳送,沒有其他選擇 2.根據1可知,當兩邊都是 或者一邊是 另一邊是 ...
noip2015運輸計畫解題報告
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...
APIO2009 搶掠計畫 解題報告
這道題碼的十分痛苦。題目鏈結 思路 tarjan縮點,重新建圖,點權轉邊權,邊權變為負值,跑一遍spfa求最長路即可。思路很簡單,但是碼量有點痛苦,打了一百行,打兩個板子就發現了許多問題,例如 程式出錯的時候不知道是 出了問題,找錯十分麻煩。我自己出現的錯誤還是挺多的,模板不是很熟悉。include...