当前位置:   article > 正文

2022 RoboCom 世界机器人开发者大赛-高职组(省赛)RC-v7 燕归来_caip robocom燕归来

caip robocom燕归来

题目

RC-v7 燕归来

无可奈何花落去,似曾相识燕归来。

研究燕子随季节迁徙的科学家们,给一批燕子做了标记,每只被标记的燕子有一个独特的编号。等它们归来时,再根据标记检查有哪些燕子没有回来,同时有哪些燕子是从别处飞来的,身上带了别人家的标记。

输入格式:

输入首先给出飞走的燕子的信息:在第一行给出不超过 105 的正整数 N,随后 N 行,每行给出一只飞走的燕子的编号。题目保证编号不重复。

随后是飞回的燕子的信息,首先是一个不超过 105 的非负整数 M,随后 M 行,每行给出一只飞回的燕子的编号。题目保证编号不重复。

编号为长度不超过 8 的、由英文字母和数字组成的字符串。

输出格式:

首先输出没有回来的燕子的信息,格式为:

  1. Missing: X
  2. ID[1]
  3. ...
  4. ID[X]

其中 X 为没有回来的燕子的数量,ID[i]i = 1, ..., X)为按字典序递增输出的这些燕子的编号。

然后输出新增燕子的信息,格式同上,只是把 Missing 换成 New

如果 X 为零,则对应情况下输出 All Back(都回来了)或 All Known(都认识)。

输入样例 1:

  1. 5
  2. CN009
  3. CN018
  4. CN001
  5. CN005
  6. CN000
  7. 6
  8. US981
  9. CN018
  10. CN000
  11. AUS83
  12. CN005
  13. RU996

输出样例 1:

  1. Missing: 2
  2. CN001
  3. CN009
  4. New: 3
  5. AUS83
  6. RU996
  7. US981

输入样例 2:

  1. 5
  2. CN009
  3. CN018
  4. CN001
  5. CN005
  6. CN000
  7. 5
  8. CN018
  9. CN001
  10. CN005
  11. CN009
  12. CN000

输出样例 2:

  1. All Back
  2. All Known

题解

概述
这道题思路不难,只是要注意AC时间,如果是常规做法,后几个测试点可能会超时,这里采用数组计数,设置一个足够大(一定要足够大,否则会段错误)的整型数组,将旧燕子的编号分段,截取后面的数字作为数组下标储存,设置一个状态,这里设置为1,例如编号为CN001的燕子,数组状态为ch[1]=1,表示这只燕子放走了,处理完放走的燕子后,处理飞回的燕子。这里就不能采用数组法了,因为飞回的燕子编号千奇百怪的,用旧燕子标记判断其是否为新增燕子,如果不是,就将数组中旧燕子的状态改变即可,如果是就直接放到容器里,用sort函数进行字典序排序就行了。最后根据题目要求输出即可,注意当新增燕子为0时需要输出"All Known"。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int ch[100001000]; //储存飞走燕子信息
  4. vector<string> v3; //储存新飞来燕子信息
  5. void huan(string s, int a) //处理每一只飞走燕子,储存信息
  6. {
  7. string z;
  8. int k = 0;
  9. z = s.substr(a, s.length() - a);
  10. for (int i = 0; i < z.length(); i++)
  11. {
  12. k += (z[z.length() - i - 1] - '0') * pow(10, i);
  13. }
  14. ch[k] = 1;
  15. }
  16. int main()
  17. {
  18. int len = 0;
  19. string biaoji; //飞走燕子编号中的英文字母
  20. string jiu, s;
  21. int miss = 0, New = 0, n, m, N;
  22. cin >> n;
  23. N = n;
  24. int j = 1;
  25. while (n)
  26. {
  27. cin >> jiu;
  28. if (n == N) //因为飞走燕子编号英文字母都一样,所以求一次就好
  29. {
  30. for (int i = 0; i < jiu.length(); i++)
  31. {
  32. if (jiu[i] >= '0' && jiu[i] <= '9')
  33. {
  34. j = i;
  35. break;
  36. }
  37. }
  38. }
  39. n--;
  40. huan(jiu, j);
  41. }
  42. biaoji = jiu.substr(0, j);
  43. len = jiu.length();
  44. cin >> m;
  45. while (m--)
  46. {
  47. cin >> s;
  48. if (s.substr(0, j) == biaoji && (s[j] >= '0' && s[j] <= '9'))
  49. {
  50. string z;
  51. int k = 0;
  52. z = s.substr(j, s.length() - j);
  53. for (int i = 0; i < z.length(); i++)
  54. {
  55. k += (z[z.length() - i - 1] - '0') * pow(10, i);
  56. }
  57. if (ch[k] == 1) //如果飞回的燕子是放走的燕子
  58. {
  59. ch[k] = 2;
  60. miss++;
  61. }
  62. else //如果不是
  63. {
  64. v3.push_back(s);
  65. New++;
  66. }
  67. }
  68. else
  69. {
  70. v3.push_back(s);
  71. New++;
  72. }
  73. }
  74. miss = N - miss; //没回来的燕子数量
  75. if (miss == 0 && New == 0)
  76. {
  77. cout << "All Back" << endl;
  78. cout << "All Known";
  79. }
  80. else
  81. {
  82. if (miss != 0)
  83. {
  84. cout << "Missing: " << miss << endl;
  85. int y = 0;
  86. while (miss)
  87. {
  88. if (ch[y] == 1)
  89. {
  90. cout << biaoji;
  91. cout << setw(len - j) << setfill('0') << y << endl; //根据编号长度前补零
  92. miss--;
  93. }
  94. y++;
  95. }
  96. }
  97. if (New != 0)
  98. {
  99. cout << "New: " << New << endl;
  100. sort(v3.begin(), v3.end()); //将新增燕子进行字典序排列
  101. for (int i = 0; i < v3.size(); i++)
  102. {
  103. cout << v3[i] << endl;
  104. }
  105. }
  106. if (New == 0) //这一步别忘了,如果没有新增燕子,有两分的测试点
  107. {
  108. cout << "All Known";
  109. }
  110. }
  111. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/639082
推荐阅读
相关标签
  

闽ICP备14008679号