[補檔]兩個奇怪的大水題
阿新 • • 發佈:2017-08-02
推出 pan align 多少 mar 及其 ide one logs
導引
這是兩道由OSU(貌似是一個我沒有聽說過的遊戲)引申出的大水題(渺到不行啊餵),壹佰萬行代碼哦。T1 OSU!
題目
osu 是一款群眾喜聞樂見的休閑軟件。 我們可以把osu的規則簡化與改編成以下的樣子: 一共有n次操作,每次操作只有成功與失敗之分,成功對應1,失敗對應0,n次操作對應為1個長度為n的01串。在這個串中連續的 X個1可以貢獻X^3 的分數,這x個1不能被其他連續的1所包含(也就是極長的一串1,具體見樣例解釋) 現在給出n,以及每個操作的成功率,請你輸出期望分數,輸出四舍五入後保留1位小數。INPUT
第一行有一個正整數n,表示操作個數。接下去n行每行有一個[0,1]之間的實數,表示每個操作的成功率。OUTPUT
只有一個實數,表示答案。答案四舍五入後保留1位小數。SAMPLE
INPUT
3 0.5 0.5 0.5OUTPUT
6.0 n<=100000樣例說明(其實並不存在,只是我瞎說的而已= =)
{0,0,0} 0 {0,0,1} 1 {0,1,0} 1 {0,1,1} 2^3=8 {1,0,0} 1 {1,0,1} 1+1=2 {1,1,0} 2^3=8 {1,1,1} 3^3=27 總期望=(0+1+1+8+1+2+8+27)/8=6
解題報告
好水啊= = 其實就是個遞推,我們要求3次方,為了方便,我們可以先推出1次方和2次方,再去推3次方,我們要用到幾個及其高(jian)深(dan)的高(xiao)等(xue)數(shu)學(xue)定(gong)理(shi):(x+y)^2=x^2+2xy+y^2
(x+y)^3=x^3+3(x^2)y+3x(y^2)+y^3
然後就可以推了1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 double f[100001],s[100001],t[100001]; 6 int n; 7 double x[100001]; 8 int main(){ 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 scanf("%lfView Code",&x[i]); 12 for(int i=1;i<=n;i++){ 13 f[i]=(f[i-1]+1)*x[i]; 14 s[i]=(s[i-1]+f[i-1]*2+1)*x[i]; 15 t[i]=t[i-1]+(s[i-1]*3+f[i-1]*3+1)*x[i]; 16 // cout<<i<<‘ ‘<<f[i]<<‘ ‘<<s[i]<<‘ ‘<<t[i]<<endl; 17 } 18 printf("%.1lf",/*f[n]+s[n]+*/t[n]); 19 }
T2 Tyvj1952 Easy
題目
某一天WJMZBMR在打osu~~~但是他太弱了,有些地方完全靠運氣:( 我們來簡化一下這個遊戲的規則 有n次點擊要做,成功了就是o,失敗了就是x,分數是按comb計算的,連續a個comb就有a*a分,comb就是極大的連續o。 比如ooxxxxooooxxx,分數就是2×2+4×4=4+16=20。 Sevenkplus閑的慌就看他打了一盤,有些地方跟運氣無關要麽是o要麽是x,有些地方o或者x各有50%的可能性,用?號來表示。 比如oo?xx就是一個可能的輸入。 那麽WJMZBMR這場osu的期望得分是多少呢? 比如oo?xx的話,?是o的話就是oooxx => 9,是x的話就是ooxxx => 4 期望自然就是(4+9)/2 =6.5了INPUT
第一行一個整數n,表示點擊的個數 接下來一個字符串,每個字符都是ox?中的一個OUTPUT
一行一個浮點數表示答案 四舍五入到小數點後4位 如果害怕精度跪建議用long double或者extendedSAMPLE
INPUT
4 ????OUTPUT
4.1250 n<=300000 osu很好玩的哦 WJMZBMR技術還行(霧),x基本上很少呢
解題報告
話說最後那句話真是interesting呢= = 其實跟上面那道題一樣,只是把概率給出的方式變得委(zhi)婉(zhang)了 顯然,o的概率為1,x的概率為0,?的概率為0.5 然後? 然後就變成了上面那道題的二次方版,但要註意遞推的時候的某些細節1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 double f[300001],s[300001]; 6 int n; 7 char op[300005]; 8 double x; 9 int main(){ 10 scanf("%d%s",&n,op+1); 11 for(int i=1;i<=n;i++){ 12 if(op[i]==‘o‘) 13 x=1.0; 14 if(op[i]==‘?‘) 15 x=0.5; 16 if(op[i]==‘x‘) 17 x=0.0; 18 f[i]=(f[i-1]+1)*x; 19 s[i]=s[i-1]+(f[i-1]*2+1)*x;//cout<<i<<‘ ‘<<f[i]<<‘ ‘<<s[i]<<endl; 20 } 21 printf("%.4f",s[n]); 22 }View Code 話說OSU到底是什麽啊= = 還有,我最近好像一直在做水題啊,這樣下去不就只能在歡聲笑語中打出GG了麽= =(水題騎臉怎麽輸)
[補檔]兩個奇怪的大水題