您的位置:首页 > 其它

搜索(水) HOJ 1870 Race

2014-02-08 09:53 309 查看

Race

My Tags  (Edit)
Source : HCPC 2005 Spring
Time limit : 3 secMemory limit : 32 M
Submitted : 187, Accepted : 159田忌赛马是个很古老的问题了。 
首先回顾一下这个故事。
齐使者如梁,孙膑以刑徒阴见,说齐使。齐使以为奇,窃载与之齐。齐将田忌善而客待之。忌数与齐诸公子驰逐重射。孙子见其马足不甚相远,马有上、中、下辈。于是孙子谓田忌曰:“君弟重射,臣能令君胜。”田忌信然之,与王及诸公子逐射千金。及临质,孙子曰:“今以君之下驷与彼上驷,取君上驷与彼中驷,取君中驷与彼下驷。”既驰三辈毕,而田忌一不胜而再胜,卒得王千金。于是忌进孙子于威王。威王问兵法,遂以为师。
现在请你思考,如果双方马匹数为K,分成K个等级,田忌的马比齐王同等级的马慢,而且比齐王低等级的马快。 赛马双方的出场顺序不定,田忌取胜的概率有多大? 
输入[/b] 
第一行一个数N,表示下面有N个测试数据。
紧接着下面N行,每行一个整数K ( 1 <= K <= 10 ) 
输出[/b]
对于每个输入K, 输出田忌取胜的概率,精确到小数点后3位。 每个输出占一行。示例输入[/b]
4
1
2
3
5
示例输出[/b]
0.000
0.000
0.167
0.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);
        }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: