小象塗色
題目描述:
小象喜歡為箱子塗色。小象現在有c
種顏色,編號為
0~c-1
;還有n
個箱子,編號為
1~n,最開始每個箱子的顏色為
1。小象塗色時喜歡遵循靈感:它將箱子按編號排成一排,每次塗色時,它隨機選擇[l,
r]這個區間裡的一些箱子(不選看做選
0個),為之塗上隨機一種顏色。若乙個顏色為
a的箱子被塗上
b色,那麼這個箱子的顏色會變成(
a*b)
mod c
。請問在
k次塗色後,所有箱子顏色的編號和期望為多少?
輸入描述:
第一行為t
,表示有
t組測試資料。
對於每組資料,第一行為三個整數n,c,k
。接下來k
行,每行兩個整數li,
ri,表示第
i個操作的l和
r。輸出描述:
對於每組測試資料,輸出所有箱子顏色編號和的期望值,結果保留9
位小數。
這是一道概率題,沒有看題解前,我一如既往地看不懂題意,算不出測試樣例。。。
好吧,開始說怎麼做。
首先注意隨機選擇一段區間(有可能為0
),表明每個箱子每次被染色的概率為
1/2。
最容易想到的dp
是f[i][j][k]
表示第i
個箱子第
j次染色,染為
k顏色的概率。明顯時間複雜度過高,只能拿部分分。
再仔細觀察就會發現,對於每個箱子,它們的本質是相同的,也就是第幾個箱子這一維狀態是不需要存在的。所以dp
狀態可簡化為
f[i][j]
,表示操作
i次,顏色變為
j的概率。
讀入時統計每個箱子操作的次數cs[i],
初始化f[0][1]=1;
f[i+1][j]+=f[i][j]/2;
f[i+1][(j+k)%c]+=f[i][j]/(2*c);
最後的答案就可以表示為∑f[cs[i]][j]*j。
貼**:
#include#include#include#includeusing namespace std;
int t,n,c,k,cs[55],maxc;
double f[55][110],ans;
void init() }}
void dp()
{ //乙個物品操作i次,顏色變為j的概率。
//每個箱子的本質是相同的。
memset(f,0,sizeof(f));
f[0][1]=1;
for(int i=0;i
NOIP模擬題 小象塗色(概率 期望 遞推)
表示數學是個渣。其實只需要推出每個箱子k次以後的顏色為i的概率就能算出期望了。對於區間 l,r 的箱子因為是任意顏色且任意取,所以概率分別為1 c和1 2,那麼整體概率就為這兩個的乘積。根據全概率公式,對於後邊的狀態我們可以累加和就行了。求出概率後期望就是顏色編號 概率。暴力40分。o k n c ...
NOIP模擬題 小象塗色(概率 期望 遞推)
表示數學是個渣。其實只需要推出每個箱子k次以後的顏色為i的概率就能算出期望了。對於區間 l,r 的箱子因為是任意顏色且任意取,所以概率分別為1 c和1 2,那麼整體概率就為這兩個的乘積。根據全概率公式,對於後邊的狀態我們可以累加和就行了。求出概率後期望就是顏色編號 概率。暴力40分。o k n c ...
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...