hdoj 2041/2042/2043/2044/2046 (递归——斐波那契数列)

超级楼梯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 46127    Accepted Submission(s): 23485


Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
 

Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
 

Output
对于每个测试实例,请输出不同走法的数量
 

Sample Input
   
   
   
   
2 2 3
 

Sample Output
   
   
   
   
1 2
#include <iostream> #include <cstdio> using namespace std; int main() {     int t,n;     int f[50];     f[1]=0;     f[2]=1;     f[3]=2;     for(int i=4;i<=40;i++)     {         f[i]=f[i-1]+f[i-2];     }     scanf("%d",&t);     while(t--)     {         scanf("%d",&n);         printf("%d\n",f[n]);     }     return 0; }

不容易系列之二

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23466    Accepted Submission(s): 18777

Problem Description
你活的不容易,我活的不容易,他活的也不容易。不过,如果你看了下面的故事,就会知道,有位老汉比你还不容易。 重庆市郊黄泥板村的徐老汉(大号徐东海,简称XDH)这两年辛辛苦苦养了不少羊,到了今年夏天,由于众所周知的高温干旱,实在没办法解决牲畜的饮水问题,就决定把这些羊都赶到集市去卖。从黄泥板村到交易地点要经过N个收费站,按说这收费站和徐老汉没什么关系,但是事实却令徐老汉欲哭无泪: (镜头回放) 近景:老汉,一群羊 远景:公路,收费站 ...... 收费员(彬彬有礼+职业微笑):“老同志,请交过路费!” 徐老汉(愕然,反应迟钝状):“锅,锅,锅,锅-炉-费?我家不烧锅炉呀?” 收费员(职业微笑依然):“老同志,我说的是过-路-费,就是你的羊要过这个路口必须交费,understand?” 徐老汉(近镜头10秒,嘴巴张开):“我-我-我知道汽车过路要收费,这羊也要收费呀?” 收费员(居高临下+不解状):“老同志,你怎么就不明白呢,那么我问你,汽车几个轮子?” 徐老汉(稍放松):“这个我知道,今天在家里我孙子还问我这个问题,4个!” 收费员(生气,站起):“嘿!老头,你还骂人不带脏字,既然知道汽车四个轮子,难道就不知道这羊有几条腿吗?!” 徐老汉(尴尬,依然不解状):“也,也,也是4个呀,这有关系吗?” 收费员(生气,站起):“怎么没关系!我们头说了,只要是4条腿的都要收费!” ...... (画外音) 由于徐老汉没钱,收费员就将他的羊拿走一半,看到老汉泪水涟涟,犹豫了一下,又还给老汉一只。巧合的是,后面每过一个收费站,都是拿走当时羊的一半,然后退还一只,等到老汉到达市场,就只剩下3只羊了。 你,当代有良知的青年,能帮忙算一下老汉最初有多少只羊吗?
 

Input
输入数据第一行是一个整数N,下面由N行组成,每行包含一个整数a(0<a<=30),表示收费站的数量。
 

Output
对于每个测试实例,请输出最初的羊的数量,每个测试实例的输出占一行。
 

Sample Input
      
      
      
      
2 1 2
 

Sample Output
      
      
      
      
4 6


#include <iostream>
#include <cstdio>
using namespace std;


int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        int sum=3;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            sum=(sum-1)*2;
        }
        printf("%d\n",sum);
    }
    return 0;
}

密码

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 45529    Accepted Submission(s): 18300


Problem Description

网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。

首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:

(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。

这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;

给你一个密码,你的任务就是判断它是不是一个安全的密码。
 

Input
输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。
 

Output
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
 

Sample Input
      
      
      
      
3 a1b2c3d4 Linle@ACM ^~^@^@!%
 

Sample Output
      
      
      
      
NO YES NO
 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;


int main()
{
    char s[60];
    int a,b,c,d,sum,t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        a=0;b=0;c=0;d=0;
        scanf("%s",s);
        int l=strlen(s);
        if(l>=8&&l<=16)
        {
            for(int i=0;i<l;i++)
            {
                if(s[i]>='A'&&s[i]<='Z')
                    a=1;
                else if(s[i]>='a'&&s[i]<='z')
                    b=1;
                else if(s[i]>='0'&&s[i]<='9')
                    c=1;
                else if(s[i]=='~'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^')
                    d=1;
            }
            sum=a+b+c+d;
            //printf("%d\n",sum);
            if(sum>=3)
                printf("YES\n");
            else
                printf("NO\n");
        }
        else
            printf("NO\n");
    }
    return 0;
}

     
     
     
     
http://acm.hdu.edu.cn/showproblem.php?pid=2044
代码:
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int t,n,m,temp;
    long long f[55];//要用 long long 额
    f[0]=0;
    f[1]=1;
    f[2]=2;
    f[3]=3;
    for(int i=4;i<55;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
//        if(n>m)
//        {
//            temp=n;
//            n=m;
//            m=temp;
//        }
        printf("%lld\n",f[m-n]);
    }
    return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=2046
代码:
#include <iostream>
#include <cstdio>
using namespace std;


int main()
{
    int n;
    long long f[55];//又是因为要用long long wa了一次
    f[1]=1;
    f[2]=2;
    f[3]=3;
    for(int i=4;i<55;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
    while(~scanf("%d",&n))
    {


        printf("%lld\n",f[n]);
    }
    return 0;
}
 

你可能感兴趣的:(hdoj 2041/2042/2043/2044/2046 (递归——斐波那契数列))