搜索(水) HOJ 1870 Race

来源:互联网 发布:程序员帅哥 编辑:程序博客网 时间:2024/05/16 01:58

Race

My Tags  (Edit)
Source : HCPC 2005 SpringTime limit : 3 secMemory limit : 32 M

Submitted : 187, Accepted : 159

田忌赛马是个很古老的问题了。 
首先回顾一下这个故事。
齐使者如梁,孙膑以刑徒阴见,说齐使。齐使以为奇,窃载与之齐。齐将田忌善而客待之。忌数与齐诸公子驰逐重射。孙子见其马足不甚相远,马有上、中、下辈。于是孙子谓田忌曰:“君弟重射,臣能令君胜。”田忌信然之,与王及诸公子逐射千金。及临质,孙子曰:“今以君之下驷与彼上驷,取君上驷与彼中驷,取君中驷与彼下驷。”既驰三辈毕,而田忌一不胜而再胜,卒得王千金。于是忌进孙子于威王。威王问兵法,遂以为师。
现在请你思考,如果双方马匹数为K,分成K个等级,田忌的马比齐王同等级的马慢,而且比齐王低等级的马快。 赛马双方的出场顺序不定,田忌取胜的概率有多大? 

输入 
第一行一个数N,表示下面有N个测试数据。
紧接着下面N行,每行一个整数K ( 1 <= K <= 10 ) 
输出
对于每个输入K, 输出田忌取胜的概率,精确到小数点后3位。 每个输出占一行。

示例输入

41235
示例输出
0.0000.0000.1670.225

题意:就是赛马,但是没有策略的随意安排,问赢的概率是多少。

思路:。。。枚举,呵呵。枚举能赢得情况有多少个,然后(输+赢)的总的情况是n!。除一下就行了。

代码:
#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<string.h>#include<algorithm>#include<queue>using namespace std;const int maxn = 20;int L[maxn] , R[maxn];int sum[11] , n;int win_sum[11];void init(){        memset(sum,0,sizeof(sum));        memset(win_sum,0,sizeof(win_sum));}void dfs(int step , int rest,int win){        if (win+rest <= n-win-rest) return;        if (rest==0)        {                ++win_sum[n];                return;        }        int x = R[0];        while (x!=n+1)        {                R[L[x]] = R[x];                L[R[x]] = L[x];                if (x > step) dfs(step+1,rest-1,win+1);                else dfs(step+1,rest-1,win);                R[L[x]] = x;                L[R[x]] = x;                x = R[x];        }}void solve(){        sum[0] = 1;        for (n = 1 ; n <= 10 ; ++n)        {                sum[n] = sum[n-1]*n;                R[0] = 1;                for (int i = 1 ; i <= n ; ++i)                 {                        L[i] = i-1;                        R[i] = i+1;                }                L[n+1] = n;                dfs(1,n,0);        }}int main(){        init();        solve();        int T;        cin>>T;        while (T--)        {                scanf("%d",&n);                double ans = (double)win_sum[n]/sum[n];                printf("%.3lf\n",ans);        }}
0 0