靈魂畫師題解

2022-04-12 02:23:41 字數 1294 閱讀 4373

可以忽略的吐槽

當窩切掉了t1簽到題之後,hin開心的開啟t2,然鵝醒目的期望讓窩懷疑人生。

來我們康康題目

顯然這題爆搜只有20。

那我們想想到底是什麼讓我們的爆搜炸掉了。

1.列舉子集這玩意不是一般的噁心

2.顯然操作越多,n張紙顏色的狀態就越多,並且\(n\leq100\),並不能狀壓

第二點顯然也是第一點導致的。

所以主要就是怎麼搞掉這個「列舉子集」。

如果從全域性來看,顯然並不好弄,所以我們不妨換個視角。從某張紙的角度出發,我們可以知道包含這張紙的操作區間一共有多少個,即這張紙最多可能被選中幾次。對於每一次操作,這張紙被選中的機率是\(\frac\),被塗上j的機率是\(\frac\)。最終對決定對答案貢獻是當前這張紙上的顏色,所以我們不妨設\(dp[i][j]\)表示進行了\(i\)次操作,紙上的顏色是\(j\)的概率,最後算貢獻的時候只需乘\(j\)即可。轉移方程:如果這張紙被選中了:\(dp[i][j*k\)%\(c]+=dp[i-1][j]/(c*2)\)。如果沒被選中:\(dp[i][j]+=dp[i-1][j]/2\)(因為被選中和不被選中的機率都是 \(\frac\) ,所以都要乘 \(\frac\) )。那麼需不需要對每張紙都來一遍dp? 不用。因為我們發現轉移式子是相同的,當\(i,j\)相同時,不同的紙的\(dp[i][j]\)一定是相同的,所以我們只需要對那個被操作次數最多的紙進行dp就可以了。

\(code\):

#include#include#include#include#include#includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return f?-x:x;

}int n,c,k,mx,sum[109];

double ans,dp[109][109];

int main()

dp[0][1]=1;

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

for(int j=0;j因為嫌大括號占行但又不想大括號不換行所以誕生了似乎更毒瘤的碼風

NOIP2017模擬賽14 靈魂畫師

靈魂畫師 題目描述 雖然不知道為什麼,但是你一直想用一種神奇的方式完成一幅畫作。你把n張畫紙鋪成一排,並將它們從1到n編號。你一共有c種顏色可用,這些顏色可以用0到c 1來編號。初始時,所有畫紙的顏色都為1。你一共想進行k次作畫,第i次作畫時,你會等概率隨機地選閉區間 li,ri 內的畫紙的乙個子集...

軟體的靈魂

估計做過軟體的人基本都有這樣的疑問 為什麼我們做的軟體這麼難使 為什麼老是不能滿足客戶的需求,今天要改這,明天要改那 等。且大都會把這些問題歸併成需求或需求管理問題,如 開發前需求沒有讓客戶簽字 需求調研不充分等。雖然某些專案的確是需求問題造成的,但我認為這並不是問題的本質,真正的原因應該在於系統的...

程式的靈魂

演算法 資料結構是程式的靈魂,是乙個程式設計者真正需要關心的東西。現在很多學程式設計的初學者往往問這樣的問題 學什麼語言好呢?哪個語言最有前途呢?起初,我也有這樣的困惑 到底學什麼語言好呢?哪個語言才能跟上時代的步伐呢?但學過來學過去的,才發現,不管是哪種語言,只不過是演算法 資料結構的外在表現形式...