1. 程式人生 > >[補檔]兩個奇怪的大水題

[補檔]兩個奇怪的大水題

推出 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.5

OUTPUT

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("%lf
",&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 }
View Code

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或者extended

SAMPLE

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了麽= =(水題騎臉怎麽輸)

[補檔]兩個奇怪的大水題