ACM训练日记—4月4日

        这几天还是正常的刷题。在整理几道题吧。

hiho1075 开锁魔法

题目:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它。初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开。崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗?

       可以看出,如果打开其中一个置换环的一个,那么整个换都开了,所以先处理出该数组有r个集合,将每个集合容量存入数组,然后用dp[i][j]表示前i个环用j个魔法打开有多少种情况,那么 dp[i][j]=Σ dp[i-1][j-k]*C[ai][k]  (1<=k<=ai)。

 代码:

int a[305],c[305];
double dp[305][305];
int vis[305];
double C[305][305];
int main()
{
    memset(C,0,sizeof(C));
    for(int i=0;i<=300;i++)
    {
        C[i][0]=C[i][i]=1.0;
        for(int j=1;j<i;j++)
            C[i][j]=C[i-1][j-1]+C[i-1][j];//预处理C(n,m),利用帕斯卡原理
    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",&c[i]);
        memset(vis,0,sizeof(vis));
        int r=0;
        for(int i=1;i<=n;i++)//处理出来所有环,记录容量
        {
            if(!vis[i])
            {
                int t=i,cnt=0;
                while(1)
                {
                    if(vis[t]) break;
                    cnt++;
                    vis[t]=1;
                    t=c[t];
                }
                a[r++]=cnt;
            }
        }
        if(k>=r)
        {
             memset(dp,0,sizeof(dp));
             dp[0][0]=1.0;
             for(int i=0;i<r;i++)
             {
                 for(int j=0;j<=k;j++)
                 {
                     //if(fabs(dp[i][j])<=0.000001) continue;
                     for(int l=1;l<=a[i]&&l+j<=k;l++)
                     {
                         dp[i+1][j+l]+=dp[i][j]*C[a[i]][l];//从第i个环中选l个
                     }
                 }
             }
             printf("%.5lf\n",(dp[r][k]/C[n][k]));
        }
        else printf("%.5lf\n",0);
    }
}

hiho1717  hiho字符串3

题意:我们定义第一代hiho字符串是"h"。  第N代hiho字符串是由第N-1代hiho字符串变化得到,规则是在每一个h后插入i,i后插入o,o后插入h。  例如第二、三、四代hiho字符串分别是: "hi"、"hiio"和"hiioiooh"。给定K,请你计算第100代hiho字符串中的第K个字符是什么。

       其实这个题只要写几代就能发现,第i代由i-1代增加而来,而增加的字符串就是二叉树型结构,第一百代就是一个一百层的二叉树,第i个数就是二叉树的第i个结点。就是从下至上到根节点在顺着倒回来变化就可以了。

代码:

就是明显的二叉树结构。

using namespace std;
ll a[10000001],sum[10000001],n;
char s[5]={'0','h','i','i','o'};
char change(char str)//变化次序
{
    if(str=='i') return 'o';
    else if(str=='o') return 'h';
    else if(str=='h') return 'i';
}
char dfs(ll k,ll t)
{
    if(k==2&&t==1) return 'i';
    if(k==2&&t==2) return 'o';
    ll w=a[k]/2;
    if(t>w)
    {
        char q=dfs(k-1,t-w);//右支
        return change(q);//右支要改变。
    }
    else if(t<=w)//左支
    {
        char q=dfs(k-1,t);
        return q;
    }
}
int main()
{
    a[1]=1;
    sum[1]=1;
    ll k=2;
    for(int i=2;;i++)
    {
        a[i]=k;
        sum[i]=sum[i-1]+a[i];
        k=k*2;
        if(sum[i]>1e15) break;
    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char ans;
        scanf("%lld",&n);
        if(n<=4) cout<<s[n]<<endl;
        else
        {
            ll l,r;
            for(int i=1;;i++)
            {
                if((sum[i]+1)>=n)
                {
                    r=i;
                    l=i-1;
                    break;
                }
            }
            ll e=n-sum[l]-1;
            //cout<<a[r]<<endl;
            char ans=dfs(r,e);
            cout<<ans<<endl;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值