标题:猜年龄
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的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 = 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 }