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。直到今天,終於想出來了。思路 開乙個一維陣列,記錄 差 的情況,同時...