zoukankan      html  css  js  c++  java
  • 2014年蓝桥杯部分题目与解答


    标题:猜年龄

    小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”

    请你写出:小明的较小的妹妹的年龄。


    注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     for (int i = 1; i < 100; i++)
     7     for (int j = i + 1; j <= i + 8; j++)
     8     {
     9         if (i * j == 6 * (i + j))
    10             cout << i << "	" << j << endl;
    11     }
    12 
    13     return 0;
    14 }

    答案:10

    标题:切面条

    一根高筋拉面,中间切一刀,可以得到2根面条。

    如果先对折1次,中间切一刀,可以得到3根面条。

    如果连续对折2次,中间切一刀,可以得到5根面条。

    那么,连续对折10次,中间切一刀,会得到多少面条呢?

    答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

    找规律: 2^n + 1

    答案:1025

    标题:神奇算式

    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

    比如:

    210 x 6 = 1260
    8 x 473 = 3784
    27 x 81 = 2187

    都符合要求。

    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

      1 #include <iostream>
      2 #include <cstring>
      3 using namespace std;
      4 
      5 int vis[10] = { 0 };            //标记每个出现过的数字
      6 
      7 //判断乘积result是否出现乘数不一样的数字,且判断result是否为4位数
      8 int judge(int result)
      9 {
     10     //判断是否为4位数
     11     if (result / 1000 > 9 || result / 1000 <= 0)
     12         return 0;
     13 
     14 
     15     int num = result % 10;
     16     while (result != 0)
     17     {
     18         vis[num] += 1;
     19         if (vis[num] != 2)        //排除result的某个数字出现不只一次
     20             return 0;
     21         result /= 10;
     22         num = result % 10;
     23     }
     24 
     25     return 1;
     26 }
     27 
     28 int main()
     29 {
     30     int cnt = 0;
     31     int mult1, mult2;
     32     int result;                //乘积结果
     33     for (int a = 1; a <= 9; a++)        //一位数乘以三位数
     34     for (int b = 1; b <= 9; b++)
     35     {
     36         if (b == a)
     37             continue;
     38         for (int c = 0; c <= 9; c++)
     39         {
     40             if (c == b || c == a)
     41                 continue;
     42 
     43             for (int d = 0; d <= 9; d++)
     44             {
     45                 if (d == a || d == b || d == c)
     46                     continue;
     47 
     48                 vis[a] += 1;
     49                 vis[b] += 1;
     50                 vis[c] += 1;
     51                 vis[d] += 1;
     52 
     53                 mult1 = a;
     54                 mult2 = b * 100 + c * 10 + d;
     55                 result = mult1 * mult2;
     56                 if (judge(result))
     57                     cnt++;
     58                 
     59                 memset(vis, 0, sizeof(vis));
     60             }
     61 
     62         }
     63     }
     64 
     65    66     int cnt2 = 0;
     67 
     68     for (int a = 1; a <= 9; a++)        //两位数乘以两位数,被乘数和乘数可以交换位置,所以此种情况得到的数量最终要除以2
     69     for (int b = 0; b <= 9; b++)
     70     {
     71         if (b == a)
     72             continue;
     73         for (int c = 1; c <= 9; c++)
     74         {
     75             if (c == b || c == a)
     76                 continue;
     77 
     78             for (int d = 0; d <= 9; d++)
     79             {
     80                 if (d == a || d == b || d == c)
     81                     continue;
     82                 vis[a] += 1;
     83                 vis[b] += 1;
     84                 vis[c] += 1;
     85                 vis[d] += 1;
     86 
     87                 mult1 = a * 10 + b;
     88                 mult2 = c * 10 + d;
     89                 result = mult1 * mult2;
     90                 if (judge(result)){
     91                     cnt2++;
     92                     
     93                 memset(vis, 0, sizeof(vis));
     94             }
     95 
     96         }
     97     }
     98     cnt += cnt2 / 2;
     99 
    100     cout << cnt << endl;
    101 
    102     return 0;
    103 }

    答案:12


    标题:扑克序列

    A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

    请填写出所有符合要求的排列中,字典序最小的那个。

    例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。


    请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。

    答案: 2342A3A4


    标题:蚂蚁感冒

    长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

    每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

    当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

    这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

    请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。


    【数据格式】

    第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。

    接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

    要求输出1个整数,表示最后感冒蚂蚁的数目。

    例如,输入:
    3
    5 -2 8
    程序应输出:
    1

    再例如,输入:
    5
    -10 8 -20 12 25
    程序应输出:
    3

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


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

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

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

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int ant[50] = { 0 };        //对应下标的蚂蚁的距离杆子最左端的距离
     5 int sick[50] = { 0 };        //标记对应下标的蚂蚁是否生病,生病了则标记为1
     6 
     7 //判断所有蚂蚁是否都离开了杆子
     8 bool judge(int n)
     9 {
    10     for (int i = 0; i < n; i++)
    11     if (ant[i] != 0 &&  ant[i] != 100)
    12         return false;
    13     return true;
    14 }
    15 
    16 int main()
    17 {
    18     int n;
    19     cin >> n;
    20     int num;
    21 
    22     sick[0] = 1;            //第一只蚂蚁已经生病了
    23 
    24     for (int i = 0; i < n; i++)
    25     {
    26         cin >> num;
    27         ant[i] = num;
    28     }
    29 
    30     while (!judge(n))
    31     {
    32         //让每只未出杆蚂蚁向着自己的方向前进一格
    33         for (int i = 0; i < n; i++)
    34         {
    35             if (ant[i] != 0 && ant[i] != 100)
    36                 ant[i]++;
    37             
    38         }
    39 
    40         //判断是否碰头,将每只蚂蚁的位置都与其他蚂蚁的位置比较一下,如果刚好相反
    41         for (int i = 0; i < n; i++)
    42         {
    43             if (ant[i] == 0 || ant[i] == 100)        //如果第i + 1只蚂蚁已经离开了杆子,则不需比较
    44                 continue;
    45 
    46             for (int j = i + 1; j < n; j++)
    47             {
    48                 if (ant[j] == 0 || ant[j] == 100)
    49                     continue;
    50 
    51                 if (ant[i] == (-1) * ant[j])        //蚂蚁碰头
    52                 {
    53                     ant[i] *= -1;
    54                     ant[j] *= -1;
    55 
    56                     if (sick[i] || sick[j])            //如果有一只蚂蚁生病了
    57                         sick[i] = sick[j] = 1;
    58                 }
    59 
    60             }
    61             
    62         }
    63     }
    64 
    65     //扫描sick数组
    66     int sickAnt = 0;
    67     for (int i = 0; i < n; i++)
    68         sickAnt += sick[i];
    69 
    70     cout << sickAnt << endl;
    71 
    72     return 0;
    73 
    74 }


    标题:地宫取宝

    X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。

    地宫的入口在左上角,出口在右下角。

    小明被带到地宫的入口,国王要求他只能向右或向下行走。

    走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

    当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。

    请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。

    【数据格式】

    输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

    接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值

    要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。

    例如,输入:
    2 2 2
    1 2
    2 1
    程序应该输出:
    2

    再例如,输入:
    2 3 2
    1 2 3
    2 1 5
    程序应该输出:
    14


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


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

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

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

     

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int treasury[50][50];
     5 long long fomulate;            //方案数
     6 int k, n, m;
     7 
     8 int dir[2][2] = { { 0, 1 }, { 1, 0 } };        //两个移动方向
     9 
    10 
    11 //dfs小明的一次移动
    12 void dfs(int row, int col, int maxValue, int amount)
    13 {
    14     //判断目前这个宝贝是否符合收录要求
    15     if (treasury[row][col] > maxValue)
    16     {
    17         //选择是否收录
    18         for (int i = 0; i < 2; i++)
    19         {
    20             if (i == 1)            //i == 0则不收录,i == 1表示收录,开始下一跳
    21             {
    22                 amount++;            //手中宝贝的数量加一
    23                 maxValue = treasury[row][col];
    24             }
    25 
    26             int nextRow, nextCol;
    27             for (int j = 0; j < 2; j++)
    28             {
    29                 nextRow = row + dir[j][0];
    30                 nextCol = col + dir[j][1];
    31 
    32                 if (nextRow < n && nextCol < m)
    33                     dfs(nextRow, nextCol, maxValue, amount);
    34             }
    35         }
    36     }
    37     else
    38     {
    39         //如果不符合收录要求
    40         int nextRow, nextCol;
    41         for (int i = 0; i < 2; i++)
    42         {
    43             nextRow = row + dir[i][0];
    44             nextCol = col + dir[i][1];
    45 
    46             if (nextRow < n && nextCol < m)
    47                 dfs(nextRow, nextCol, maxValue, amount);
    48         }
    49 
    50     }
    51 
    52     if (row == n - 1 && m - 1 == col)
    53     {
    54         if (amount == k)
    55             fomulate++;
    56         
    57         
    58         return;
    59     }
    60 
    61 }
    62 
    63 int main()
    64 {
    65     //int n, m, k;
    66     cin >> n >> m >> k;
    67     
    68 
    69     int value;
    70     for (int i = 0; i < n; i++)
    71     for (int j = 0; j < m; j++)
    72     {
    73         cin >> value;
    74         treasury[i][j] = value;
    75     }
    76 
    77     dfs(0, 0, 0, 0);
    78 
    79     cout << fomulate % 1000000007 << endl;
    80 
    81     return 0;
    82 }

    这段代码有点问题,但就是找不到错在哪


    标题:斐波那契

    斐波那契数列大家都非常熟悉。它的定义是:

    f(x) = 1 .... (x=1,2)
    f(x) = f(x-1) + f(x-2) .... (x>2)

    对于给定的整数 n 和 m,我们希望求出:
    f(1) + f(2) + ... + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
    公式参见【图1.png】

    但这个数字依然很大,所以需要再对 p 求模。

    【数据格式】
    输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
    输出为1个整数

    例如,如果输入:
    2 3 5
    程序应该输出:
    0

    再例如,输入:
    15 11 29
    程序应该输出:
    25

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


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

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

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

     刚开始用递归:内存超限

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //递归求f(n)
     5 long long f(long long n)
     6 {
     7     if (n == 1 || n == 2)
     8         return 1;
     9     return f(n - 1) + f(n - 2);
    10 }
    11 
    12 int main()
    13 {
    14     long long n, m, p;
    15     cin >> n >> m >> p;
    16     long long fm;
    17 
    18     fm = f(m);
    19     long long sum = 0;
    20     for (long long i = 1; i <= n; i++)
    21     {
    22         sum += f(i);
    23         sum %= f(m);
    24     }
    25 
    26     sum %= p;
    27     cout << sum << endl;
    28 
    29     return 0;
    30 }

    改进后:时间超限

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //递归求f(n)
     5 long long f(long long n)
     6 {
     7     if (n == 1 || n == 2)
     8         return 1;
     9     return f(n - 1) + f(n - 2);
    10 }
    11 
    12 int main()
    13 {
    14     long long n, m, p;
    15     cin >> n >> m >> p;
    16     long long fm;
    17     long long sum = 2;
    18     long long i = 3;
    19     long long a3, a1 = 1, a2 = 1;
    20 
    21     fm = f(m);
    22 
    23     while (i <= n)
    24     {
    25         a3 = a1 + a2;
    26         a1 = a2;
    27         a2 = a3;
    28 
    29         sum += a3;
    30         sum %= fm;
    31         i++;
    32     }
    33 
    34     sum %= p;
    35     cout << sum << endl;
    36 
    37     return 0;
    38 }

    再次改进后:时间超限50%

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     long long n, m, p;
     7     cin >> n >> m >> p;
     8     long long fm;
     9     long long sum = 2;
    10     long long i = 3;
    11     long long a3, a1 = 1, a2 = 1;
    12 
    13 
    14     if (m < n)
    15     {
    16         while (i <= n)
    17         {
    18             a3 = a1 + a2;
    19             a1 = a2;
    20             a2 = a3;
    21             sum += a3;
    22             if (i == m)
    23                 fm = a3;
    24             i++;
    25         }
    26     }
    27     else
    28     {
    29         while (i <= m)
    30         {
    31             a3 = a1 + a2;
    32             a1 = a2;
    33             a2 = a3;
    34             if (i <= n)
    35                 sum += a3;
    36             i++;
    37         }
    38         fm = a3;
    39     }
    40     sum %= fm;
    41 
    42     sum %= p;
    43     cout << sum << endl;
    44 
    45     return 0;
    46 }

    最后一次改进:时间还是超限50%,不知道怎么改进了。。。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     long long n, m, p;
     7     cin >> n >> m >> p;
     8     long long fm;
     9     long long sum = 2;
    10     long long i = 3;
    11     long long a3, a1 = 1, a2 = 1;
    12 
    13     if (m < n)
    14     {
    15         while (i <= n)
    16         {
    17             a3 = a1 + a2;
    18             sum += a3;
    19             if (i == m)
    20                 fm = a3;
    21             i++;
    22 
    23             a1 = a2 + a3;
    24             sum += a1;
    25             if (i == m)
    26                 fm = a1;
    27             i++;
    28 
    29             a2 = a1 + a3;
    30             sum += a2;
    31             if (i == m)
    32                 fm = a2;
    33             i++;
    34         }
    35         if (i == n + 1)
    36             sum = sum;
    37         else if (i == n + 2)
    38             sum = sum - a2;
    39         else
    40             sum = sum - a1 - a2;
    41     }
    42     else
    43     {
    44         while (i <= m)
    45         {
    46             a3 = a1 + a2;
    47             sum += a3;
    48             if (i <= n)
    49                 sum += a3;
    50             i++;
    51             
    52             a1 = a2 + a3;
    53             sum += a1;
    54             if (i <= n)
    55                 sum += a1;
    56             i++;
    57 
    58             a2 = a1 + a3;
    59             sum += a2;
    60             if (i <= n)
    61                 sum += a2;
    62             i++;
    63         }
    64         if (i == m + 1)
    65             fm = a2;
    66         else if (i == m + 2)
    67             fm = a1;
    68         else
    69             fm = a3;
    70 
    71     }
    72     sum %= fm;
    73     sum %= p;
    74     cout << sum << endl;
    75 
    76     return 0;
    77 }
  • 相关阅读:
    性能优化与使用Block实现数据回传(3)
    封装思想和抽取(2)
    磁盘缓存的计算与清理(1)
    滑动返回的延伸(全局滑动返回功能)
    滑动返回功能被覆盖的解决思路
    OC之类与对象
    OC之OC与C的比较
    OC之知识储备篇
    C语言之总结3
    C语言总结2
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/10544423.html
Copyright © 2011-2022 走看看