北京師範大學程式設計決賽- C. 萌萌噠身高差(找規律)
題目連結
題目
“清明時節雨紛紛,路上行人慾斷魂。”
然而wfy同學的心情是愉快的,因為BNU ACM隊出去春遊啦!並且,嗯。。。
以下是wfy同學的日記:
昨天,何老師告訴我們:明天我們去春遊,大家準備好喝的和吃的哦!
大家聽了都興奮起來,有的歡呼,有的鼓掌,開心得不得了。第二天,我們早早地來到學校,迫不及待地上了車,來到了公園。一進門,啊,太美了!公園中有那麼多樹,有高有矮,有粗有瘦,密密的,在春風吹拂下輕輕搖擺著,像是歡迎我們的到來。公園中有那麼多的鮮花,有紅有黃,有紫有白,散發著淡淡的清香,聞得我們都醉了。公園的邊角上有一條清澈的小河,河水緩緩地流淌著,可以看到水裡的魚兒在快活地游來游去,多自在啊!水草碧綠碧綠的,多新鮮啊!小河的旁邊是一片小樹林,遠遠望去一片鮮綠。我們在裡面吃東西、做遊戲、捉迷藏,玩得瘋極了。樹林的後面是連綿起伏的小山坡,蜿蜿的真像一條遊動的蛇。當然,我覺得公園的天空也很美。它萬里無雲,一碧如洗,很清澈。小鳥在展翅飛翔,它們形態各異,一會兒上升,一會兒下滑,一會兒吃蟲,一會兒在小樹林裡休息,非常悠閒。快樂時光總是那麼短暫,很快,天色就昏暗了。我們依依不捨地上了車,回到了學校,我真希望明年的春天還能再來看看這美麗的公園。
回到學校後,何老師說:請大家排成一排,我們來拍照片啦!
何老師特別喜歡萌的東西,比如,比如**,等等。
何老師認為,同學們站成一排時,相鄰兩個同學身高相差越多,這兩個同學站在一起越萌。
那麼所有相鄰兩個同學的身高差加起來越大,拍出來的照片就越萌,也就是這張照片的萌力指數。
何老師希望拍出來的照片的萌力指數儘可能大。
然而何老師並不是數學老師,而是語文老師。何老師覺得很GG。
何老師只想知道,如果讓同學們隨便站成一排(站成所有排列的可能性都相等),萌力指數的數學期望是多少。
聰明的我一下子就算出了答案,然後何老師就獎勵了我一個很萌的禮物。
今天真的好開心。
BNU ACM隊共有n名同學,身高分別是1, 2, \dots , n,聰明的你能計算出何老師想要的數學期望嗎?
Input
第一個是一個正整數T(T \leq 20),表示測試資料的組數,
每組測試資料只有一行,包含一個整數n(2 \leq n \leq 100)。
Output
對於每組測試資料,輸出一行,包含一個實數,表示萌力指數的數學期望值,要求相對誤差不超過10^{-9},
也就是說,令輸出結果為a,標準答案為b,若滿足\frac{ \left | a-b \right | }{max(1,b)} \leq 10^{-9},則輸出結果會被認為是正確答案。
Sample Input
2
2
3
Sample Output
1.000000000000
2.666666666667
分析
先寫一發暴力解法,觀察到約分後分母要麼為1,要麼為3,將其統一為3。然後就發現分子有遞推規律(當時只看出遞推規律,其實最簡單的規律是n^2-1).
暴力解法
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int a[maxn];
int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++) a[i]=i+1;
int fz=0;
do
{
for(int i=1;i<n;i++) fz+=abs(a[i]-a[i-1]);
}while(next_permutation(a,a+n));
int fm=1;
for(int i=1;i<=n;i++) fm*=i;
cout<<"fz="<<fz<<" "<<"fm="<<fm<<" "<<fz/gcd(fm,fz)<<"/"<<fm/gcd(fz,fm)<<endl;
}
return 0;
}
找出的規律
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
double d[maxn];
void init()
{
d[2]=3;
double k=5;
for(int i=3;i<maxn;i++)
{
d[i]=d[i-1]+k;
k+=2;
}
}
int main()
{
init();
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
printf("%.12lf\n",d[n]/3);
}
return 0;
}