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 }
原文地址:https://www.cnblogs.com/hi3254014978/p/10544423.html