當(dāng)前位置:
首頁 >
Easy与Osu
發(fā)布時間:2025/7/14
33
豆豆
Easy
題目描述
某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠運(yùn)氣:(
我們來簡化一下這個游戲的規(guī)則
有n次點擊要做,成功了就是o,失敗了就是x,分?jǐn)?shù)是按comb計算的,連續(xù)a個comb就有a*a分,comb就是極大的連續(xù)o。
比如ooxxxxooooxxx,分?jǐn)?shù)就是2*2+4*4=4+16=20。
Sevenkplus閑的慌就看他打了一盤,有些地方跟運(yùn)氣無關(guān)要么是o要么是x,有些地方o或者x各有50%的可能性,用?號來表示。
比如oo?xx就是一個可能的輸入。
那么WJMZBMR這場osu的期望得分是多少呢?
比如oo?xx的話,?是o的話就是oooxx => 9,是x的話就是ooxxx => 4
期望自然就是(4+9)/2 =6.5了
輸入
第一行一個整數(shù)n,表示點擊的個數(shù)
接下來一個字符串,每個字符都是ox?中的一個
輸出
一行一個浮點數(shù)表示答案
四舍五入到小數(shù)點后4位
如果害怕精度跪建議用long double或者extended
樣例輸入
4 ????樣例輸出
4.1250n<=300000 osu很好玩的哦 WJMZBMR技術(shù)還行(霧),x基本上很少呢Osu
題目描述
osu 是一款群眾喜聞樂見的休閑軟件。? 我們可以把osu的規(guī)則簡化與改編成以下的樣子:? 一共有n次操作,每次操作只有成功與失敗之分,成功對應(yīng)1,失敗對應(yīng)0,n次操作對應(yīng)為1個長度為n的01串。在這個串中連續(xù)的 X個1可以貢獻(xiàn)X^3 的分?jǐn)?shù),這x個1不能被其他連續(xù)的1所包含(也就是極長的一串1,具體見樣例解釋)? 現(xiàn)在給出n,以及每個操作的成功率,請你輸出期望分?jǐn)?shù),輸出四舍五入后保留1位小數(shù)。?輸入
第一行有一個正整數(shù)n,表示操作個數(shù)。接下去n行每行有一個[0,1]之間的實數(shù),表示每個操作的成功率。?輸出
只有一個實數(shù),表示答案。答案四舍五入后保留1位小數(shù)。?樣例輸入
3 0.5 0.5 0.5樣例輸出
6.0【題解】
一個游戲產(chǎn)生的兩道題,只不過一個是二次方一個是三次方,套路非常相近。f[i]表示以i為結(jié)尾的極大連續(xù)1長度的期望(其實在此處還不用考慮結(jié)尾不結(jié)尾的事),g[i]表示平方的期望,h[i]表示立方的期望。g[i]本應(yīng)=(f[i-1]+1)^2=f[i-1]*f[i-1]+2*f[i-1]+1,但是這里平方是在期望意義下的,所以用g[i-1]代替f[i-1]*f[i-1],最后乘上這一位是1的概率,立方同理。計算結(jié)果時要考慮下一位的情況了,再乘上(1-p[i+1])。這道題在期望、概率、數(shù)字之間的轉(zhuǎn)化比較靈活,也展現(xiàn)了高次遞推的一些套路。安心地使用double并沒有炸精度。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int sj=300010; int n; double f[sj],g[sj],jg; char a[sj]; int main() {//freopen("t.txt","r",stdin);scanf("%d%s",&n,a);for(int i=1;i<=n;i++){if(a[i-1]=='o') {f[i]=f[i-1]+1;g[i]=g[i-1]+2*f[i-1]+1;}if(a[i-1]=='x'){ f[i]=0;g[i]=0;}if(a[i-1]=='?'){ f[i]=(f[i-1]+1)/2;g[i]=(g[i-1]+2*f[i-1]+1)/2;}if(a[i]!='?'&&a[i]!='o') jg+=g[i];if(a[i]=='?') jg+=g[i]/2;}printf("%.4lf",jg);//while(1);return 0; } #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int sj=100010; double f[sj],g[sj],h[sj],jg,p[sj]; int n; int main() {//freopen("t.txt","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++) {scanf("%lf",&p[i]);f[i]=(f[i-1]+1)*p[i];}for(int i=1;i<=n;i++) g[i]=(g[i-1]+2*f[i-1]+1)*p[i];for(int i=1;i<=n;i++){ h[i]=(h[i-1]+3*g[i-1]+3*f[i-1]+1)*p[i];jg+=h[i]*(1-p[i+1]);}printf("%.1lf",jg);//while(1);return 0; }
?
?轉(zhuǎn)載于:https://www.cnblogs.com/moyiii-/p/7241936.html
總結(jié)
- 上一篇: Linux下基本栈溢出攻击【转】
- 下一篇: POJ 1260 Pearls