• hdu1297Children’s Queue (递推+大数)


    hdu 1297 Children’s Queue

    题目大意:n个学生排成一列,要求女生要么没有,要么不能单独一个女生排在一起。

    思路:令f(x)表示x个学生的排列的种数。如果第n个学生是男生,那么前n-1个人只要满足条件即可,可能数为f(n-1)。

    如果最后一个学生为女生,那么第n-1个学生一定也是女生,考虑前n-2个学生的情况。如果前n-2个学生的排列满足条件,当然可以。(最难得地方)如果前n-2个学生的排列不满足条件,也有使整体满足条件的可能。即:前第n-2个学生是女生,第n-3个学生是男生,最后前n-4个学生满足条件即可。综上:f(n) = f(n-1) + f(n-2)+f(n-4);

    code:

    #include <iostream>
    #include <cstring>
    #include<cstdio>
    char dashu[1005][1000];
    using namespace std;
    void add(int a,int b){
        int len_a,len_b;
        len_a = strlen(dashu[a]);
        len_b = strlen(dashu[b]);
        int zf = 0;           //代表进位
        int i = 0;
        int ta,tb,d;             //ta,tb分别代表该位的数值  
        while(i < len_a || zf == 1){
            ta = tb = 0;
            if(i <len_a)
                ta = dashu[a][i]-'0';
            if(i < len_b){
                tb = dashu[b][i]-'0';
            }
            d = ta+tb+zf;
            d = d > 9?d-10:d;
            if(ta+tb+zf > 9){
                zf = 1;
            }
            else {
                zf = 0;
            }
            dashu[a][i] = '0' + d;
            i++;
        }
    }
    void printDashu(int a){
        int len = strlen(dashu[a]);
        for(int i = len-1;i >= 0;i --)
            cout << dashu[a][i];
        cout << endl;
    }
    int main()
    {
        int n;
        dashu[1][0] = '1';
        dashu[2][0] = '2';
        dashu[3][0] = '4';
        dashu[4][0] = '7';
        for(int i = 5;i <= 1000;i ++)
        {
            strcpy(dashu[i],dashu[i-1]);
            add(i,i-2);
            add(i,i-4);
        }
        while(cin >> n){
            printDashu(n);
        }
        return 0;
    }
  • 相关阅读:
    tarjan无向图缩点
    8、11 T1:入阵曲:复杂度估算,观察规律与性质,数据存储与查询
    容斥系数
    模拟测试12:
    模拟测试11:冷静稳健。
    好的文章
    容器,函数等
    后缀数组:
    HDU5618 Jam's problem again CDQ分治
    P3810 陌上花开 CDQ分治
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5450832.html
Copyright © 2020-2023  润新知