届蓝桥杯.docx

上传人:b****7 文档编号:10167079 上传时间:2023-02-09 格式:DOCX 页数:19 大小:43.90KB
下载 相关 举报
届蓝桥杯.docx_第1页
第1页 / 共19页
届蓝桥杯.docx_第2页
第2页 / 共19页
届蓝桥杯.docx_第3页
第3页 / 共19页
届蓝桥杯.docx_第4页
第4页 / 共19页
届蓝桥杯.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

届蓝桥杯.docx

《届蓝桥杯.docx》由会员分享,可在线阅读,更多相关《届蓝桥杯.docx(19页珍藏版)》请在冰豆网上搜索。

届蓝桥杯.docx

届蓝桥杯

第1题:

统计不含4的数字

题目大意

  统计10000至99999中,不包含4的数值个数。

解题分析:

     

第一种解法:

     数学方法,这种是在网上看到的一种解法:

  最高位除了0、4不能使用,其余8个数字(1,2,3,5,6,7,8,9)均能使用,剩下的四位(千位、百位、十位、个位)

        可以使用除了4以外的所有数字,所以共有8*9*9*9*9种解,

       计算得答案为:

52488。

第二种解法:

     暴力搜索方法,这个数字的位数共有5位因此,可以设置a,b,c,d,e,分别代表这5位。

代码:

#include

#include

usingnamespacestd;

intmain()

{

      inta,b,c,d,e;

      intcount=0;

      for(a=1;a<=9;a++)

      {

            for(b=0;b<=9;b++)

            {

                  for(c=0;c<=9;c++)

                  {

                        for(d=0;d<=9;d++)

                        {

                              for(e=0;e<=9;e++)

                              {

                                    if(a!

=4&&b!

=4&&c!

=4&&d!

=4&&e!

=4)

                                    {

                                       count++;

                                    }

                              

                              }

                        

                        }

                  

                  }

            

            }

      

      }

      cout<

      return0;

}

输出为:

   52488

第2题:

计算1千天后的日期

题目大意

  2014-11-09再过1000天是哪一日?

解题分析:

我想这里题目,对于大家来说分析的时候难点就在于那年是闰年,那年是平年

那么从2014到2017年之间2016年是闰年,因此这一年就是365天,

这道题,我是手算的。

答案是:

      2017-08-05

重点是要按照格式提交。

 

第3题:

竖式加法

题目大意

  祥瑞生辉 

  三羊献瑞 

?

?

?

?

?

?

?

?

 

 三羊生瑞气 

  

 

题目用了8个不同的汉字,表示0~9里八种不同的数字。

组成两个数值相加,等于第三个数值。

求三羊献瑞”对应到数字是多少?

 

解题分析:

第一种暴力搜索:

我假设结果中进位的是1,那么三对应的就是数字1.

接下来定义变量。

   abcd

+1 e f b

------------------

 1ecbg

代码:

这段代码输三个结果,把每个结果带进去试一下就知道那个是了。

#include

#include

usingnamespacestd;

intmain()

{

   inta,b,c,d,e,f,g;

   for(a=1;a<=9;a++)

   {

      for(b=0;b<=9;b++)

      {

         for(c=0;c<=9;c++)

         {

            for(d=0;d<=9;d++)

            {

                  for(e=0;e<=9;e++)

                  {

                     for(f=0;f<=9;f++)

                     {

                        for(g=0;g<=9;g++)

                        {

                              if((a*1000+b*100+c*10+d)+(1000+e*100+f*10+b)==(10000+e*1000+c*100+b*10+g))

                              {

                                 if(a!

=1&&b!

=1&&c!

=1&&d!

=1&&e!

=1&&f!

=1)

                                 {

                                       if(a!

=b&&a!

=c&&a!

=d&&a!

=e&&a!

=f&&a!

=g&&b!

=c&&b!

=d&&b!

=e&&b!

=f&&b!

=g&&c!

=d&&c!

=e&&c!

=f&&c!

=g&&d!

=e&&d!

=f&&d!

=g&&e!

=f&&e!

=g&&f!

=g)

                                       {

                                             cout<<1*1000+e*100+f*10+b<

                                       }

                                    

                                 }

                              }

                        

                        }

                     }

                  }

            

            }

         }

      }

   }

   return0;

}

 

第二种解法:

全排列方法:

代码:

#include

#include

#include

usingnamespacestd;

intmain()

{

   inta[10];

   for(inti=0;i<=9;i++)

   {

         a[i]=i;

   }

   do

   {

      if(!

a[2]||!

a[6])

            continue;

      intx=a[2]*1000+a[3]*100+a[4]*10+a[5];

      inty=a[6]*1000+a[7]*100+a[8]*10+a[3];

      intz=a[6]*10000+a[7]*1000+a[4]*100+a[3]*10+a[9];

      if(x+y==z)

         cout<

   }while(next_permutation(a,a+10));

   return0;

}

=======================================================================================

                                                                                                             代码填空

=======================================================================================

 

第4题:

古怪的星号修饰符

题目大意

  是道代码填空题,主要是完成一个字符串s,按宽度width截断后,在固定宽度为width,两边为符号’|’的居中输出。

 

  难点是题目给出了printf(“%*s%s%*s”,___),要求填printf的实参列表。

这道题看的时候觉得有点坑,因为自己不懂printf("%*s%s%*s",);;的意思,我开始还以为是指针那一块的。

现在把网上的给大家分享:

有些童鞋可能知道scanf里用*修饰符,是起到过滤读入的作用。

比如一个有三列数值的数据,我只想得到第2列数值,可以在循环里用scanf(“%*d%d%*d”,a[i])来读入第i行的第2个数值到a[i]。

 

  *修饰符在printf中的含义完全不同。

如果写成printf(“%6d”,123),很多童鞋应该就不会陌生了,这是设置域宽的意思。

同理,%6s也是域宽。

*修饰符正是用来更灵活的控制域宽。

使用%*s,表示这里的具体域宽值由后面的实参决定,如printf(“%*s”,6,“abc”)就是把”abc”放到在域宽为6的空间中右对齐。

 

  明白了*是用变量来控制域宽,那么这题就简单了,这里应该填写5个实参。

然后字符长度的计算应该用buf而不是s,因为buf才是截断后的长度,用s的话,如果s长度超过了width-2,效果就不对了。

 

类似使用说明的代码如下:

#include

#include

#include

usingnamespacestd;

intmain(){

   chars[100]="abcd1234";

   charbuf[1000];

   intwidth=20;

   strcpy(buf,s);

   buf[width-2]=0;

   printf("|%*s%s%*s|\n",(width-strlen(buf)-2)/2,"",buf,(width-strlen(buf)-2)/2,"");

   return0;

}

 

第5题:

补充全排列的回溯算法

题目大意

  1,2,3…9这九个数字组成一个分数,其值恰好为1/3,如何组法?

与第3题一样可以用全排列暴力,但这题是代码填空题,且已经手写一部分全排列算法,我们负责补充其中一行代码。

 

  写全排就是用回溯的思想,直接猜到for循环里的第三行,应该就是把第一行的交换操作再交换回来~~复制for里的第一行代码,运行下程序,还不放心就调试下,看看数组是不是有按字典序在变化就行了。

 

  答案:

{t=x[k];x[k]=x[i];x[i]=t;}

 

======================================================================================             

                                                                                                                  填空

=======================================================================================

第6题:

加号改乘号

题目大意

  把1+2+3+…+48+49中的两个加号改成乘号(修改位置不能相邻),使得式子的结果由1225变为2015。

解题分析:

用双循环暴力两个乘号的位置,计算在数字i、j后的加号改为乘号,式子数值的变化即可,注意j的起始位置为i+2。

代码:

#include

#include

usingnamespacestd;

intmain()

{

   for(inti=1;i<=48;i++)

   {

         for(intj=i+2;j<=48;j++)

         {

               if(1225-i-(i+1)-j-(j+1)==2015-i*(i+1)-j*(j+1))

                     cout<

         }

   

   }

   return0;

}

第7题:

牌型种数

题目大意

 

原题:

小明被劫持到X赌城,被迫与其他3人玩牌。

一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。

这时,小明脑子里突然冒出一个问题:

如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

解题分析:

       这里也是两种方法,暴力搜索,动态规划(DP)。

  第一种:

暴力方法:

#include

#include

usingnamespacestd;

intmain()

{

   inta[13];   

   staticintcount;

   intans=0;

   for(a[0]=0;a[0]<=4;a[0]++)

   {

      for(a[1]=0;a[1]<=4;a[1]++)

      {

         for(a[2]=0;a[2]<=4;a[2]++)

         {

            for(a[3]=0;a[3]<=4;a[3]++)

            {

               for(a[4]=0;a[4]<=4;a[4]++)

               {

                  for(a[5]=0;a[5]<=4;a[5]++)

                  {

                     for(a[6]=0;a[6]<=4;a[6]++)

                     {   

                        for(a[7]=0;a[7]<=4;a[7]++)

                        {

                           for(a[8]=0;a[8]<=4;a[8]++)

                           {

                              for(a[9]=0;a[9]<=4;a[9]++)

                              {

                                 for(a[10]=0;a[10]<=4;a[10]++)

                                 {

                                    for(a[11]=0;a[11]<=4;a[11]++)

                                    {

                                       for(a[12]=0;a[12]<=4;a[12]++)

                                       {

                                          if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13)

                                          {

                                             count++;

                                             ans=count;

                                          }

                                       }

                                    }

                                 }

                              }

                           }

                        }

                     }

                  }   

               }

            }

         }

      }

   }

   cout<

   return0;

}

 

具体参考:

 

解法二:

动态规划, DP。

假设牌是从1到13按顺序取的,dp[i][j]表示取到第i号的牌,目前总共有j张牌的取法总数,那么有状态转移方程(注意公式没考虑边界处理):

 

  如图:

 

代码:

#include

#include

usingnamespacestd;

typedeflonglongLL;

LLdp[14][14];//dp[i][j]:

当前到第i张牌,总共有j张牌时的解的个数

intmain(){

   dp[1][0]=dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1;

   for(inti=2;i<=13;i++){

       for(intk=0;k<=13;k++){

           if(k-4>=0)dp[i][k]+=dp[i-1][k-4];

           if(k-3>=0)dp[i][k]+=dp[i-1][k-3];

           if(k-2>=0)dp[i][k]+=dp[i-1][k-2];

           if(k-1>=0)dp[i][k]+=dp[i-1][k-1];

           dp[i][k]+=dp[i-1][k];

       }

   }

   cout<

   return0;

}

 

第8题:

计算房子间曼哈顿距离

题目大意

  房子按S形摆放,如 

  123 

  654 

  78…… 

  现输入每行的宽度w,计算出任意两个房子m、n的曼哈顿距离(横向距离+竖向距离)。

解题分析:

直接计算两点的距离就可以了。

代码:

#include

#include

#include

usingnamespacestd;

Fun(intw,intn,int&x,int&y)

{

      x=(n-1)/w+1;

  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1