1. 程式人生 > >北京師範大學程式設計決賽- C. 萌萌噠身高差(找規律)

北京師範大學程式設計決賽- 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;
}