百度笔试

Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)

Problem Description:

有一天上体育课,老师让所有的学生排成一行,同时要求女生不能单独的站在队列中,也就说必须有2个以上的女生站在一起。举例来说,假如有4个学生,那么可能的排列方式为FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM(其中F表示女生,M表示男生),4个学生有以上的7种组合。请编写程序,计算n个学生的符合以上要求的排队方式数量。(1<=n<=1000)

输入

输入正整数n,其中1<=n<=1000

输出

输出符合要求的数量,其中当n为1000时,返回的值非常大,请注意处理这种大数问题。


样例输入

4

5

10

20

样例输出

7

12

200

55405

 

复制代码
#include <stdio.h>

int result[1005][105]={0};

void init2(int n);
void init(){
    int i;
    result[1][1] = 1;
    result[2][1] = 2;
    result[3][1] = 4;
    result[4][1] = 7;
    for(i = 5;i<1001;i++)
    {
        init2(i);
    }
}
int main()
{

    int n,i;
    init();
    while(scanf("%d",&n)!=EOF)
    {
        //找到第一个不为零的
        for(i = 100;i > 0&& result[n][i]==0;i--);
        //输出结果
        printf("%d",result[n][i]);
        --i;
        for(;i>0;--i)
        {
            printf("%04d",result[n][i]);
        }
        printf("\n");
    }
    return 0;
}
void init2(int n)
{
    int dddddd=0,i;
    for(i = 1;i<101;i++)
    {
        dddddd += result[n-1][i] + result[n-2][i] + result[n-4][i];
        result[n][i] = dddddd%10000;
        dddddd /= 10000;
    }
    while(dddddd)
    {
        result[n][i++] = dddddd%10000;
        dddddd /= 10000;
    }

}
复制代码

 

posted @   stonehat  阅读(419)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示