• Children’s Queue (大数/高精度)


    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1297

    题意:有n个位置,男孩女孩排队,要求女孩至少要2个在一起,求符合规则的结果


    这一题是排序问题,因为结果非常大,且为前几项相加,所用到了大数的加法。


    题目的分析也很有意思

    规则:女孩至少要2个在一起

    求f(n)

    一 , 当最后一个是男生M,则前 n-1 只要符合规则的排列即可,有f(n-1)个

    ~~~~|M     有f(n-1)个

    二,当最后一个为女生F,则有两种情况

    1)最后两个都为女生 ,则则前 n-2 只要符合规则的排列即可,有f(n-2)个

    ~~~~|FF    有f(n-2)个

    2)最后两个都为女生 ,则则前 n-2 也可以不符合规则,

             此时第n-2个是F,第n-3是M,此时前n-2个不符合规则,但因为第n-2 的F与第n-1 的F相邻,所以整体符合规则,有f(n-4)个

    ~~~~|MFFF     有f(n-4)个


    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    
    string add(string s1,string s2)
    {
        string sa,sb;
        sa=s1;
        sb=s2;
        if(sa.length()<sb.length())
        {
            //让sa 指向长的字符串,sb 指向短的字符串
            sa=s2;
            sb=s1;
        }
        int len1=sa.length();
        int len2=sb.length();
    
        //将sb的每一位与0的差值加到sa中的每一位中
        //此时sa中每一位表示此位上的个数  例如十位数上有11个数,则其真实值为110
        for(int i=len2-1,j=len1-1; i>=0; i--,j--)
            sa[j]+=sb[i]-'0';
    
        for(int i=len1-1; i>=1; i--)
        {
            //检查sa[1]~sa[len1-1],如果其值大于'9',则在其前一位进一,而s[0]单独判断
            if(sa[i]>'9')
            {
                sa[i-1]++;
                sa[i]-=10;
            }
        }
    
        if(sa[0]>'9') //最高位大于'9',则在前加一
        {
            sa[0]-=10;
            sa='1'+sa;
        }
        return sa;
    }
    
    int main ()
    {
        int n;
        string f[1001];
        f[0]="1"; //当n=4时,MFFF这种情况只有一种可能
        f[1]="1";
        f[2]="2";
        f[3]="4";
        for(int i=4; i<=1001; i++)
        {
            f[i]=add(f[i-1],f[i-2]);
            f[i]=add(f[i],f[i-4]); //两步来实现f[n]=f[n-1]+f[n-2]+f[n-4]
        }
        while(cin>>n) //提示:预先算出所有值,不然提交会超时
        {
            cout<<f[n]<<endl;
        }
        return 0;
    }
    
    
    


  • 相关阅读:
    Go复习--为何不允许重载overload?
    Go疑问-1
    Go复习--for循环陷井
    Go复习--slice协程不安全
    Go复习之久违的goto语句
    Go复习---编译错误:undefined:
    Linux 环境拷贝文件发生的错误
    【转载】java数据库操作
    VBA文件处理
    【转】关于C#使用Excel的数据透视表的例子
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746118.html
Copyright © 2020-2023  润新知