noip模擬小象塗色

2021-07-05 10:16:47 字數 1351 閱讀 5311

小象塗色

題目描述:

小象喜歡為箱子塗色。小象現在有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...