zoukankan      html  css  js  c++  java
  • 蓝桥杯 2016/3/17 測试 前6题题解...

    仅仅有答案。。。。。将就着看吧 近期没时间写解题报告。

    。。。
    至于为什么没有第7题 。

    。由于我不会啊。

    。。。

    1

    一个串的子串是指该串的一个连续的局部。

    假设不要求连续,则可称为它的子序列。
    比方对串: “abcdefg” 而言,”ab”,”abd”,”bdef” 等都是它的子序列。
    特别地,一个串本身。以及空串也是它的子序列。

    对两个串而言,能够有很多的共同的子序列,我们关心的是:它们所共有的长度最大的子序列是多长。下面代码实现了这个问题的求解。请填写划线部分缺失的代码。

    注意:仅仅填写划线部分缺少的内容。不要填写不论什么多余的符号或凝视、说明等。

    比如,不要填写已经给出的小括号。

    //   tag==1  &&  *p!=' '   
    
    
    #include <stdio.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
    
    int get_word_num(char* buf)
    {
        int n=0;
        int tag=1;
        char* p=buf;
    
        for( ; *p!=0&&*p!=13&&*p!=10; p++)
        {
            if(*p==' ' && tag==0)
                tag=1;
            if(   tag==1  &&  *p!=' '   )
            {
                n++;
                tag=0;
            }
        }
    
        return n;
    }
    
    int main()
    {
        char buf[1000];
        fgets(buf,1000,stdin);
    
        printf("%d
    ", get_word_num(buf));
        return 0;
    }
    

    2

    1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。

    它是发散的。也就是说,仅仅要加上足够多的项,就能够得到随意大的数字。

    可是,它发散的非常慢:

    前1项和达到 1.0
    前4项和才超过 2.0
    前83项的和才超过 5.0

    那么。请你计算一下,要加多少项,才干使得和达到或超过 15.0 呢?

    请填写这个整数。

    注意:仅仅须要填写一个整数。不要填写不论什么多余的内容。

    比方说明文字。

    #include <stdio.h>   
    #include <algorithm>
    #include <iostream>
    #include <math.h>
    #include <string.h>
    #define  C  0.57721566490153286060651209
    using namespace std;
    
    int main()
    {
        double sum=0;
        int flag=0;
        for(int n=1000000; n<10000000; n++)
        {
            if(log(n)+C>=15)
                {
                    printf("%d
    ",n);
                    break;
                }
        }
        return 0;
    }
    
    //----------------- 正常解法
    
    #include<stdio.h>
    int main()
    {
        int n,k;
        double sum=0;
        for(int i=1; i<10000000000000; i++)
        {
            double m=double((1000000000000000000.0/i));
            sum+=m;
           // printf("i=%d  m=%d  sum=%d
    ",i,m,sum);
            if(sum>=15000000000000000000)
            {
                printf("i=%d  sum=%d",i,sum);
                break;
            }
    
        }
        return 0;
    }

    3


    假设x的x次幂结果为10(參见【图1.png】)。你能计算出x的近似值吗?

    显然,这个值是介于2和3之间的一个数字。

    请把x的值计算到小数后6位(四舍五入)。并填写这个小数值。

    注意:仅仅填写一个小数。不要写不论什么多余的符号或说明。

    //手动二分
    
    
    #include <stdio.h>
    #include <math.h>
    int main()
    {
        double x=2.506184;
    
        double x10=pow(x,x);
    
        printf("%.10lf
    ",x10);
        return 0;
    }
    
    //暴力
    #include <stdio.h>
    #include <math.h>
    int main()
    {
       // double x=2.506184;
        double x10;double x;
        for(x=2.000000;x<3;x+=0.0000001)
        {
             x10=pow(x,x);
             if(x10>=10)
                break;
        }
        printf("%.10lf
    ",x);
        return 0;
    }
    

    4

    今有7对数字:两个1,两个2,两个3。…两个7,把它们排成一行。


    要求,两个1间有1个其他数字,两个2间有2个其他数字,以此类推,两个7之间有7个其他数字。

    例如以下就是一个符合要求的排列:

    17126425374635

    当然,假设把它倒过来,也是符合要求的。

    请你找出还有一种符合要求的排列法,而且这个排列法是以74开头的。

    注意:仅仅填写这个14位的整数,不能填写不论什么多余的内容,比方说明凝视等。

    #include <stdio.h>
    int a[15];
    int b[8];
    
    void judge()
    {
        for(int i=1; i<15; i++)
            printf("%d",a[i]);
    
        printf("+++++
    ");
    }
    
    void dfs(int n)
    {
        //еп╤о
    /*
        for(int i=1; i<15; i++)
            printf("%d",a[i]);
        printf("      ");
        for(int i=1; i<8; i++)
            printf("%d",b[i]);
        printf("
    ");
    */
        if(n>14)
        {
             judge();
             return ;
        }
    
        if(a[n])
        {
            dfs(n+1);
            return;
        }
    
    
        int sum=0;
        for(int i=1; i<7; i++)
        {
            if(b[i])
                sum+=i;
        }
        if(sum==21)
        {
             judge();
             return ;
        }
    
    
    
        for(int i=1; i<7; i++)
        {
            if(b[i]||a[n+1+i]||n+1+i>14||i==4)
                continue;
    
            if(a[n])
            {
                i--;
                continue;
            }
            a[n]=i;
            a[n+i+1]=i;
            b[i]=1;
            dfs(n+1);
            a[n]=0;
            a[n+i+1]=0;
            b[i]=0;
        }
    
    }
    
    int main()
    {
        a[1]=7,a[2]=4,a[7]=4,a[9]=7;
        b[7]=1,b[4]=1;
    
        dfs(3);
    
      //  judge();
        int s;
        scanf("%d",&s);
        return 0;
    }
    

    5

    勾股定理。西方称为毕达哥拉斯定理。它所相应的三角形如今称为:直角三角形。

    已知直角三角形的斜边是某个整数。而且要求另外两条边也必须是整数。

    求满足这个条件的不同直角三角形的个数。

    【数据格式】
    输入一个整数 n (0 < n < 10000000) 表示直角三角形斜边的长度。
    要求输出一个整数,表示满足条件的直角三角形个数。

    比如,输入:
    5
    程序应该输出:
    1

    再比如,输入:
    100
    程序应该输出:
    2

    再比如,输入:
    3
    程序应该输出:
    0

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 1000ms

    请严格按要求输出。不要画蛇添足地打印相似:“请您输入…” 的多余内容。

    全部代码放在同一个源文件里。调试通过后。拷贝提交该源代码。

    注意: main函数须要返回0
    注意: 仅仅使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。


    注意: 全部依赖的函数必须明白地在源文件里 #include , 不能通过project设置而省略经常使用头文件。

    提交时,注意选择所期望的编译器类型。

    #include <stdio.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
    int main()
    {
        int n,sum;
        cin>>n;
    
        sum=0;
        double other;
        for(int i=1; i<n; i++)
        {
            other=n*n-i*i;
            if(sqrt(other)==(int)sqrt(other))
                sum++;
        }
        cout<<sum/2<<endl;
    
        return 0;
    }
    

    6

    你一定听说过“数独”游戏。


    如【图1.png】。玩家须要依据9×9盘面上的已知数字,推理出全部剩余空格的数字,并满足每一行、每一列、每个同色九宫内的数字均含1-9。不反复。

    数独的答案都是唯一的,所以,多个解也称为无解。

    本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

    本题的要求就是输入数独题目,程序输出数独的唯一解。

    我们保证全部已知数据的格式都是合法的。而且题目有唯一的解。

    格式要求:
    输入9行,每行9个数字。0代表未知。其他数字为已知。
    输出9行,每行9个数字表示数独的解。

    比如:
    输入(即图中题目):
    005300000
    800000020
    070010500
    400005300
    010070006
    003200080
    060500009
    004000030
    000009700

    程序应该输出:
    145327698
    839654127
    672918543
    496185372
    218473956
    753296481
    367542819
    984761235
    521839764

    再比如,输入:
    800000000
    003600000
    070090200
    050007000
    000045700
    000100030
    001000068
    008500010
    090000400

    程序应该输出:
    812753649
    943682175
    675491283
    154237896
    369845721
    287169534
    521974368
    438526917
    796318452

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 2000ms

    请严格按要求输出,不要画蛇添足地打印相似:“请您输入…” 的多余内容。

    全部代码放在同一个源文件里,调试通过后。拷贝提交该源代码。

    注意: main函数须要返回0
    注意: 仅仅使用ANSI C/ANSI C++ 标准。不要调用依赖于编译环境或操作系统的特殊函数。


    注意: 全部依赖的函数必须明白地在源文件里 #include , 不能通过project设置而省略经常使用头文件。

    提交时,注意选择所期望的编译器类型。

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    char a[20][20],f=0;
    
    int judge(int x,int y)
    {
        //推断横竖有没有重的
        for(int i=1; i<10; i++)
        {
            if(i!=y&&a[x][i]==a[x][y]||i!=x&&a[i][y]==a[x][y])
                return 0;
        }
        //推断小九宫格里有没有重的
        int xx,yy;
    
        if(x>=1&&x<=3)
            xx=1;
        else if(x>=4&&x<=6)
            xx=4;
        else if(x>=7&&x<=9)
            xx=7;
    
        if(y>=1&&y<=3)
            yy=1;
        else if(y>=4&&y<=6)
            yy=4;
        else if(y>=7&&y<=9)
            yy=7;
    
        int xxx=xx+3,yyy=yy+3;
        for(int i=xx; i<xxx; i++)
        {
            for(int j=yy; j<yyy; j++)
            {
                if(a[i][j]==a[x][y])
                    if(i!=x&&j!=y)
                        return 0;
            }
        }
        return 1;
    }
    
    void output()
    {
        for(int i=1; i<=9; i++)
        {
            puts(a[i]+1);
        }
        return ;
    }
    
    void dfs(int x,int y)
    {
        if(f==1)
            return;
        if(x==9&&y==9)//到头了 要跳回去
        {
            output();
            f=1;
            return ;
        }
        for(int i=x; i<10; i++)
        {
            for(int j=1; j<10; j++)
            {
                if(a[i][j]!='0')
                {
                    if(i==9&&j==9)
                    {
                        output();
                        f=1;
                        return ;
                    }
                    continue;
                }
    
                for(int k=1; k<10; k++)
                {
                    a[i][j]=k+'0';
                    if(judge(i,j))
                        dfs(i,j);
                    a[i][j]='0';
                    if(i==9&&j==9)//到头了 要跳回去
                    {
                        output();
                        f=1;
                        return ;
                    }
                    if(k==9)
                        return ;
                }
            }
        }
    }
    
    int main()
    {
        // freopen("in.txt", "r", stdin);
        // freopen("outt.txt", "w", stdout);
    
        for(int j=1; j<=9; j++)
        {
            gets(a[j]+1);
        }
        dfs(1,1);
        return 0;
    }
    
  • 相关阅读:
    java 新建文本并写入
    批处理 获取相同进程的所有 pid
    io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: error:
    Linux下“/”和“~”的区别
    Error creating bean with name 'consoleConfig'
    2019 蓝桥杯省赛 B 组模拟赛 结果填空:马的管辖
    # Codeforces Round #663 (Div. 2)
    Codeforces Round #645 (Div. 2) A~D
    迷宫2 NC15196
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8309056.html
Copyright © 2011-2022 走看看