杭电2048(此种方法比较麻烦的,建议推荐本人的 【杭电2048(递推)】http://www.cnblogs.com/xiohao/archive/2012/09/28/2706573.html)

问题分析:此题也是一道递推问题!首先,当m=4的时候 例如 {1 2 3 4 其中当1取2的时候
                                                        1 2 3 4}
此时如果2取1,则只能3和4互相交换({3 4  相当于a[2]的值)!如果2取3或4,则剩余{3 4
                                   3 4}                                       1 4}
此时相当于{1 2 3 中1取2剩余的情况!!依次类推 b=(double)1/(i-1)*a[i-2]+(double)(i-2)/(i-1)*Q;
           1 2 3}                                   a[i]=(double)(i-1)/i*b;

        

#include<iostream>
using namespace std;
int main()
{
 int n,m,i;double a[25],b,Q;
 cin>>n;
    getchar();
 while(n--)
   {
    cin>>m;
    a[1]=0;
    a[2]=0.5;
    a[3]=(double)1/3;
    Q=0.5;

    for(i=4;i<=m;i++)
    {     b=(double)1/(i-1)*a[i-2]+(double)(i-2)/(i-1)*Q;
          a[i]=(double)(i-1)/i*b;
           Q=b;

    }
    printf("%.2lf",a[m]*100);cout<<"%"<<endl;
    }
 return 0;
}

posted on 2012-09-24 18:13  @ 小浩  阅读(488)  评论(0编辑  收藏  举报