ZJUT 1317 擲飛盤 (高斯解期望問題)

2021-06-08 21:12:45 字數 1035 閱讀 4942

by---cxlove

題目:有m個人,圍成乙個圈,有兩個飛盤,1/2的概率往左往右擲,最初兩個飛盤相隔n,問兩個飛盤到乙個人手中的期望次數為多少。

每一次擲飛盤,有4種方案,兩個都順時針,兩個都逆時針,一順一逆。

對於這4種方案,造成飛盤間隔的變化是有規律的  我們令e[i]表示間隔為i時到目標狀態的所需步數

那麼e[i]=(2*e[i]+e[i-2]+e[i+2])/4。其中e[0]是目標狀態為 0

e[n]為所求。

可以發現間隔的範圍是 0-m/2,如果大於m/2可以轉換一下。

一開始可能處理得非常麻煩,分了很多情況以及奇偶

不過可以直接轉換,如果出現負的則轉正,如果出現大於上界,則取另外一邊的。

開始的wa是因為沒有考慮到有一些狀態不可達,又忽視了這個重要的地方。

先搜尋一遍,標記可以到達的狀態,並編號,然後對於這些狀態建立方程

#include#include#include#include#include#include#define ll long long

#define mod 1000000007

#define eps 1e-6

#define zero(a) fabs(a)tot) x=m-x;

return x;

}void dfs(int x)

bool gauss(int n)

i++;}}

for(int r=i;rm/2) n=m-n;

if(n==0)

if(m%2==0&&n==1)

tot=m/2;

memset(num,-1,sizeof(num));

cnt=0;

dfs(n);

if(num[0]==-1)

memset(a,0,sizeof(a));

a[num[0]][num[0]]=1;

for(int i=1;i<=tot;i++)

}// debug(cnt);

if(gauss(cnt)){

for(int i=0;i

ZJUT1266 大菲波數

寫了乙個大數加,一次ac。但是時間上感覺沒有優勢。對比了別人的,感覺有點遠。不知道是不是細節處理的問題。求優化。以下貼 include using namespace std char fp 1001 250 void add int a,int b,int c else for fp b i 0 ...

ZJUT1099 最少攔截系統

沒想到越來越順手 之前一直看別人做這道題,自己卻沒什麼idea。沒想到今天寫了一下,只測試了幾組資料,連修改都沒有就一次ac,而且time 9ms,memory 208k。值得慶幸一下 不過還是要繼續努力。昨天訂的演算法導論沒想到今天就到手了,很是快。贊一下 之後還要好好加油啊!這道題的ac率不高,...

ZJUT1476 禮物放置 DP

一道想了很久做了很久很久的dp題。真真正正地算是自己做出來了,沒有參考任何東西。開始的時候是要像以前的cash machine之類的題那樣記錄所有的情況,但是後來發現可能會有重複的現象。之後打算開個二維陣列記錄,誰知道老是報rte。直到今天,終於想出來了。思路 開乙個一維陣列,記錄 差 的情況,同時...