标题:猜年龄
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的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 << "\t" << 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 = 378427 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个整数,表示最后感冒蚂蚁的数目。
例如,输入:35 -2 8程序应输出:1
再例如,输入:5-10 8 -20 12 25程序应输出:3
资源约定:峰值内存消耗 < 256MCPU消耗 < 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 21 22 1程序应该输出:2
再例如,输入:2 3 21 2 32 1 5程序应该输出:14
资源约定:峰值内存消耗 < 256MCPU消耗 < 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
资源约定:峰值内存消耗 < 256MCPU消耗 < 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 }