当前位置:   article > 正文

2024C++信息素养大赛-智能算法应用挑战赛_复赛真题(广东省)题目+参考答案和详细解析

2024C++信息素养大赛-智能算法应用挑战赛_复赛真题(广东省)题目+参考答案和详细解析

1.翻转数相乘

【题目描述】

假设一个n位数,如a1a2a3...an,其中a1是这个数的第i位上的数字,,且这个n位数不是每个位都相等的数字,例如不是2222或类似。如果,有一个整数x,并且1<x<10,使得a1a2a3...an*x=an…a2a1,求x,其中a1和an不能为0,如果x无解,则输出0,如果有多个x,则从小到大输出,所有x的解,中间用空格隔开。例如:一个5位数,ABCDE*?=EDCBA其中A、B、C、D、E是个位整数,ABCDE和EDCBA是一个万位数,求符合这个等式的乘数。

【输入格式】输入1个数,表示要求解的n位数。

【输出格式】输出表示所有可能的乘数,并按照从小到大排列,用回车隔开。

【样例输入】(测试数据不包含本样例)

6

【样例输出】

4

9

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. // 将一个数字字符串反转
  4. string reverseString(const string &str) {
  5. string reversedStr = str; // 复制输入字符串
  6. reverse(reversedStr.begin(), reversedStr.end()); // 反转字符串
  7. return reversedStr; // 返回反转后的字符串
  8. }
  9. // 将一个数字字符串乘以一个整数
  10. string multiplyStringByInt(const string &num, int x) {
  11. string result; // 存储乘积结果
  12. int carry = 0; // 进位
  13. // 从最低位开始逐位相乘
  14. for (int i = num.size() - 1; i >= 0; --i) {
  15. int product = (num[i] - '0') * x + carry; // 当前位与 x 相乘,加上进位
  16. result.push_back((product % 10) + '0'); // 保存当前位的结果
  17. carry = product / 10; // 更新进位
  18. }
  19. // 处理剩余的进位
  20. while (carry) {
  21. result.push_back((carry % 10) + '0');
  22. carry /= 10;
  23. }
  24. reverse(result.begin(), result.end()); // 反转结果字符串
  25. return result; // 返回乘积结果
  26. }
  27. // 计算 10 的 n 次幂
  28. int powerOfTen(int n) {
  29. int result = 1; // 初始化结果为 1
  30. for (int i = 0; i < n; ++i) {
  31. result *= 10; // 连乘 n 次 10
  32. }
  33. return result; // 返回 10 的 n 次幂
  34. }
  35. // 检查某个 x 是否满足条件
  36. bool isValid(int n, int x) {
  37. int start = powerOfTen(n - 1); // n 位数的起始值(最低 n 位数)
  38. int end = powerOfTen(n); // n 位数的终止值(超出 n 位数的最小值)
  39. // 枚举所有 n 位数
  40. for (int i = start; i < end; ++i) {
  41. string original = to_string(i); // 将数字转换为字符串
  42. string reversed = reverseString(original); // 反转字符串
  43. string product = multiplyStringByInt(original, x); // 计算乘积
  44. // 检查乘积是否等于反转后的字符串
  45. if (product == reversed) {
  46. return true; // 如果相等,返回 true
  47. }
  48. }
  49. return false; // 如果没有满足条件的 x,返回 false
  50. }
  51. int main() {
  52. int n; // 输入的 n 位数的位数
  53. cin >> n; // 读取输入
  54. vector<int> solutions; // 存储所有符合条件的 x
  55. // 枚举所有可能的 x(从 2 到 9)
  56. for (int x = 2; x < 10; ++x) {
  57. if (isValid(n, x)) { // 检查 x 是否符合条件
  58. solutions.push_back(x); // 如果符合,加入结果集
  59. }
  60. }
  61. // 输出结果
  62. if (solutions.empty()) { // 如果没有符合条件的 x
  63. cout << 0 << endl; // 输出 0
  64. } else {
  65. for (size_t i = 0; i < solutions.size(); ++i) { // 遍历结果集
  66. cout << solutions[i] << endl; // 输出每一个符合条件的 x
  67. }
  68. }
  69. return 0; // 程序结束
  70. }

2.吉利号码

[题目描述]

中国人喜欢图吉利,包括吉利数字,例如数字8或者数字6,尤其是连着的数字更加喜欢,比如手机号码,汽车车牌,房间号码等等。有需求就会有市场,吉利数字的号码,往往意味着更贵的价格。请你根据以下规则,编写一个程序,根据规则给一个号码设置相应的价格。

具体规则如下:

1.正常号码是100元。

2. 含有:6,8任何一个数字,每出现一次加50元,例如4326,6875,9918都符合加分标准。其中,6875被加2个50元,就相当于加100元。

3.如果出现升序或者降序的情况,不管升序还是降序,号码涨价3倍。例如:5678,4321都要贵3倍。注意:例如5567,4331等有相同元素的号码不算降序、升序。

4.如果出现三个相同数字情况,都涨6倍。例如:4888,6665,7777都满足加分的标准。注意:7777因为满足这条标准两次,所以这条规则给它涨两个6倍,也就是12倍。

5.如果符合AABB或者ABAB模式的,价格涨一倍。例如:2255,3939,7777都符合这个模式,所以都会涨价。注意:7777因为满足这条标准两次,所以这条标准给它涨2倍,同时7777也是连号,也会在之前连号的基础上继续涨价。

请编写程序按照所有规则,求一个号码的最终价格!要求程序从标准输入接收数据,在标准输出上输出结果。

[输入格式]

输入共1行,输入一个四位正整数,就是待计算的号码。

[输出格式]

输出共1行,一个整数,表示这个号码对应的销售价格。

[样例输入](测试数据不包含本样例)

6543

[样例输出]

450

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. // 计算号码的销售价格
  4. int calculatePrice(int number) {
  5. string numStr = to_string(number); // 将数字转换为字符串方便处理
  6. int price = 100; // 初始价格为100元
  7. // 规则2:含有6或8的数字,每个加50元
  8. for (char digit : numStr) {
  9. if (digit == '6' || digit == '8') {
  10. price += 50;
  11. }
  12. }
  13. // 规则3:升序或降序,价格涨3倍
  14. bool ascending = is_sorted(numStr.begin(), numStr.end());
  15. bool descending = is_sorted(numStr.rbegin(), numStr.rend());
  16. if (ascending || descending) {
  17. price *= 3;
  18. }
  19. // 规则4:三个相同的数字,价格涨6倍
  20. if (numStr[0] == numStr[1] && numStr[1] == numStr[2]) {
  21. price *= 6;
  22. } else if (numStr[1] == numStr[2] && numStr[2] == numStr[3]) {
  23. price *= 6;
  24. }
  25. // 规则5:AABB或ABAB模式,价格涨1倍
  26. if ((numStr[0] == numStr[1] && numStr[2] == numStr[3]) ||
  27. (numStr[0] == numStr[2] && numStr[1] == numStr[3])) {
  28. price *= 2;
  29. }
  30. return price;
  31. }
  32. int main() {
  33. int number;
  34. cin >> number; // 输入待计算的号码
  35. int finalPrice = calculatePrice(number); // 计算号码的最终价格
  36. cout << finalPrice << endl; // 输出最终价格
  37. return 0;
  38. }

3.将整数换成分数

[题目描述]

一个小于100万的正整数n,尝试把n变成带分数形式,也就是 n=a+b/c,其 中a,b,c是三个正整数,并且数字1~9(不含0)在a、b、c中,必须出现,且只能出现一次。例如:100=3+69258/714,其中1到9这9个数字全都出现了,并且只出现一次。当然,100还等于82+3546/197,也就是说将100变成带分数形式,会有两种组合方式。事实上100,可以写成11种1到9组成整数加上分数的形式。

请编写一个程序,根据一个输入N,程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部可能性。不要求输出每个表示,只输出有多少种表示法!

[输入格式]

输入一行,表示要分解的正整数。

[输出格式]

输出一行,表示有多少分法。

【样例输入](测试数据不包含本样例)

100

[样例输出]

11

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. // 判断三个整数的组合是否包含1到9且每个数字只出现一次
  4. bool isValidCombination(int a, int b, int c) {
  5. string str = to_string(a) + to_string(b) + to_string(c);
  6. if (str.size() != 9) return false; // 长度必须正好为9
  7. unordered_set<char> digits(str.begin(), str.end());
  8. return digits.size() == 9 && digits.find('0') == digits.end(); // 不包含0且包含所有数字1-9
  9. }
  10. int main() {
  11. int n;
  12. cin >> n;
  13. int count = 0;
  14. // 枚举所有可能的a,b,c
  15. // 枚举所有可能的c
  16. for (int c = 1; c <= 98765; ++c) {
  17. // 枚举所有可能的a
  18. for (int a = 1; a < n; ++a) {
  19. // 计算 b 的值
  20. int b = (n - a) * c;
  21. // 检查是否符合数字组合条件
  22. if (b > 0 && isValidCombination(a, b, c)) {
  23. count++;
  24. }
  25. }
  26. }
  27. cout << count << endl;
  28. return 0;
  29. }

4.战胜白蚁

[题目描述]

小明因为很长时间没有回家,发现他家被白蚁给入侵了,白蚁特别喜欢啃食木头,因此他家的地板就遭殃了。小明要抢救被白蚁破坏的木地板,每个木地板由于白蚁的数量不同,每个地板进行维修的时间也不同,同时要争取及时修理越好,否则超过某个时间,这块地板就会被严重破坏掉。小明只能一块一块的清理白蚁,不能并行操作,也就是不能同时修多块地板。

请编写一个程序,根据每个地板的修理时间和如果不修理就会被白蚁完全损毁的 时间,进行一个最合理的排序,使得可以抢救最多的木板。输入是木板的数目,以及每个木板的维修时间和被破坏的时间,输出是能抢救的最多木板的数量。

[输入格式]

第一行是一个整数N(N小于50000),接下来N行每行两个整数T1,T2描述一个要修理的木板:修理这个木板需要T1秒,如果在T2秒之内还没有修理完成,这个木板就报废了。

[输出格式]

输出一个整数S,表示最多可以抢修S个木板。

[样例输入](测试数据不包含本样例)

4

100 200

200 1300

1000 1250

2000 3200

【样例输出]

3

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. // 定义木板结构体
  4. struct Board {
  5. int T1; // 修理时间
  6. int T2; // 被破坏时间
  7. };
  8. // 比较函数,按照 T2 升序排序
  9. bool compare(Board& b1, Board& b2) {
  10. return b1.T2 < b2.T2;
  11. }
  12. int rescueBoards(int N, vector<Board>& boards) {
  13. // 按照 T2 升序排序
  14. sort(boards.begin(), boards.end(), compare);
  15. int rescuedCount = 0;
  16. int currentTime = 0;
  17. for (int i = 0; i < N; ++i) {
  18. if (currentTime + boards[i].T1 <= boards[i].T2) {
  19. rescuedCount++;
  20. currentTime += boards[i].T1;
  21. }
  22. }
  23. return rescuedCount;
  24. }
  25. int main() {
  26. int N;
  27. cin >> N;
  28. vector<Board> boards(N);
  29. for (int i = 0; i < N; ++i) {
  30. cin >> boards[i].T1 >> boards[i].T2;
  31. }
  32. int result = rescueBoards(N, boards);
  33. cout << result << endl;
  34. return 0;
  35. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号