周末測試-JC的小蘋果

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   tar   

    讓我們繼續JC和DZY的故事。
“你是我的小丫小蘋果,怎麼愛你都不嫌多!”
“點亮我生命的火,火火火火火!”
話說JC曆經艱辛來到了城市B,但是由於他的疏忽DZY偷走了他的小蘋果!沒有小蘋果怎麼聽歌!他發現邪惡的DZY把他的小蘋果藏在了一個迷宮裡。JC在經曆了之前的戰鬥後他還剩下hp點血。開始JC在1號點,他的小蘋果在N號點。DZY在一些點裡放了怪獸。當JC每次遇到位置在i的怪獸時他會損失Ai點血。當JC的血小於等於0時他就會被自動彈出迷宮並且再也無法進入。
但是JC迷路了,他每次只能從當前所在點出發等機率的選擇一條道路走。所有道路都是雙向的,一共有m條,怪獸無法被殺死。現在JC想知道他找到他的小蘋果的機率。

輸入格式:
第一行三個整數表示n,m,hp。接下來一行整數,第i個表示jc到第i個點要損失的血量。保證第1個和n個數為0。接下來m行每行兩個整數a,b表示ab間有一條無向邊。

輸出格式:
僅一行,表示JC找到他的小蘋果的期望機率,保留八位小數。

範例輸入:
3 3 2 0 1 0 1 2 1 3 2 3

範例輸出:
0.87500000

資料範圍:
對於10%的資料n=5,hp=1
對於30%的資料n<=20,hp<=5
對於60%的資料n<=50,hp<=10000
對於另外10%的資料 所有點權均為正
對於100%的資料 2<=n<=150,hp<=10000,m<=5000,保證圖聯通,點權非負。

時間限制:
4s

空間限制:
256M

 

囧,一開始不知道點權非負,是後來加上去的,問別人才知道

copy題解(懶得寫了,題解講得比我好多了):

【演算法一】
爆搜(雖然我也不知道怎麼搜) 期望的分10
【演算法二】
把所有點按照hp拆點,然後高斯消元,複雜度O(hp^3*n^3)。期望的分30
【演算法三】
我們發現對於hp來說層與層之間是DAG,所以每一層做高斯消元。然後層與層之間遞推就可以了。複雜度O(hp*n^3),期望的分60
【演算法四】
大致同演算法三,但是我們發現每一次高斯消元的矩陣除了常數項都是相同的,所以可以先進行一次高斯消元預先處理,其它只要做帶入的工作即可。複雜度O(hp*n^2),期望的分100

 

囧,自環環太無語,只能加一條,不能加兩次

  1 const  2     maxn=152;  3     maxm=5050;  4     maxhp=10010;  5     eps=1e-9;  6 var  7     x,y:array[0..maxn,0..maxn]of double;  8     f:array[0..maxhp,0..maxn]of double;  9     ff:array[0..maxn]of double; 10     a,d,first:array[0..maxn]of longint; 11     last,next:array[0..maxm*2]of longint; 12     n,m,hp,tot:longint; 13     ans:double; 14   15 procedure insert(x,y:longint); 16 begin 17     if x=n then exit; 18     inc(tot); 19     last[tot]:=y; 20     next[tot]:=first[x]; 21     first[x]:=tot; 22     inc(d[x]); 23 end; 24   25 procedure swap(var x,y:double); 26 var 27     t:double; 28 begin 29     t:=x;x:=y;y:=t; 30 end; 31   32 procedure work; 33 var 34     i,j,k:longint; 35     s:double; 36 begin 37     for i:=1 to n do 38         begin 39             j:=first[i]; 40             while j<>0 do 41                 begin 42                     if a[last[j]]=0 then x[last[j],i]:=x[last[j],i]-1/d[i]; 43                     j:=next[j]; 44                 end; 45         end; 46     for i:=1 to n do x[i,i]:=x[i,i]+1; 47     for i:=1 to n do y[i,i]:=1; 48     for i:=1 to n-1 do 49         begin 50             for j:=i to n do 51                 if abs(x[j,i])>eps then break; 52             for k:=1 to n do swap(x[i,k],x[j,k]); 53             for k:=1 to n do swap(y[i,k],y[j,k]); 54             for j:=i+1 to n do 55                 if abs(x[j,i])>eps then 56                 begin 57                     s:=x[j,i]/x[i,i]; 58                     for k:=1 to n do x[j,k]:=x[j,k]-x[i,k]*s; 59                     for k:=1 to n do y[j,k]:=y[j,k]-y[i,k]*s; 60                 end; 61         end; 62     for i:=n downto 2 do 63         for j:=1 to i-1 do 64             if abs(x[j,i])>eps then 65             begin 66                 s:=x[j,i]/x[i,i]; 67                 for k:=1 to n do x[j,k]:=x[j,k]-x[i,k]*s; 68                 for k:=1 to n do y[j,k]:=y[j,k]-y[i,k]*s; 69             end; 70     for i:=1 to n do 71         for j:=1 to n do 72             y[i,j]:=y[i,j]/x[i,i]; 73 end; 74   75 procedure main; 76 var 77     i,j,k,u,v:longint; 78 begin 79     read(n,m,hp); 80     for i:=1 to n do read(a[i]); 81     for i:=1 to m do 82         begin 83             read(u,v); 84             if u<>v then insert(u,v); 85             insert(v,u); 86         end; 87     work; 88     f[hp,1]:=1; 89     for i:=hp downto 1 do 90         begin 91             ff:=f[i]; 92             ans:=ans+ff[n];ff[n]:=0; 93             for j:=1 to n do f[i,j]:=0; 94             for j:=1 to n do 95                 for k:=1 to n do 96                     f[i,j]:=f[i,j]+ff[k]*y[j,k]; 97             ans:=ans+f[i,n];f[i,n]:=0; 98             for j:=1 to n do 99                 begin100                     k:=first[j];101                     while k<>0 do102                         begin103                             if (i-a[last[k]]>0) and (a[last[k]]>0) then104                             f[i-a[last[k]],last[k]]:=f[i-a[last[k]],last[k]]+f[i,j]/d[j];105                             k:=next[k];106                         end;107                 end;108         end;109     writeln(ans:0:8);110 end;111  112 begin113     main;114 end. 
View Code

 更新:bzoj上有了題目,但是pascal一直被卡,想了n久,無奈交了std(C++的),突然又想到一個最佳化,15s+卡過了(好辛酸啊)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.