当前位置:   article > 正文

2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)_睿抗编程技能赛试题

睿抗编程技能赛试题

目录

1. 亚运会奖牌榜

2. 出院

3. 骰子游戏

4. 相对论大师

5. 相对成功与相对失败 


1. 亚运会奖牌榜

 输入样例:

  1. 15
  2. 0 1
  3. 0 2
  4. 0 3
  5. 0 1
  6. 0 1
  7. 0 2
  8. 0 3
  9. 1 3
  10. 1 3
  11. 1 3
  12. 1 3
  13. 1 2
  14. 1 1
  15. 1 1
  16. 1 1

 输出样例:

  1. 3 2 2
  2. 3 1 4
  3. The first win!

具体代码实现:

vector<int>类型通过简单的'>'和‘<’刚好可以实现题目所说的比较

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int> a,b;
  4. int r1[4],r2[4];
  5. int main(void){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++){
  9. int c,p;
  10. cin>>c>>p;
  11. if(c==0){ //第一个国家
  12. r1[p]++;
  13. }else{
  14. r2[p]++;
  15. }
  16. }
  17. for(int i=1;i<4;i++){
  18. if(i!=1) cout<<" ";
  19. cout<<r1[i];
  20. }
  21. cout<<endl;
  22. for(int i=1;i<4;i++){
  23. if(i!=1) cout<<" ";
  24. cout<<r2[i];
  25. }
  26. cout<<endl;
  27. for(int i=1;i<4;i++){
  28. a.push_back(r1[i]);
  29. b.push_back(r2[i]);
  30. }
  31. if(a>b)
  32. cout<<"The first win!";
  33. else
  34. cout<<"The second win!";
  35. return 0;
  36. }

2. 出院

  输入样例:

  1. 5 6
  2. Diet A
  3. LowSugarTea B
  4. Milk C
  5. Coke D
  6. Water A
  7. DietCoke
  8. Pepsi
  9. Milk
  10. CokeWater
  11. GoodMilk
  12. dietCoke

  输出样例:

  1. AD
  2. D
  3. C
  4. DA
  5. D
  6. D

具体代码实现:

根据题意:拆分字符串只能拆分成两部分

  1. //思路:因为这个字符串只能被拆成两个,
  2. //那么我们就直接使用指针将其拆成两个,判断是否存在即可
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. map<string,string>mp; //存储对应关系
  6. int n,m;
  7. int main(void){
  8. cin>>n>>m;
  9. for(int i=0;i<n;i++){
  10. string s1,s2;
  11. cin>>s1>>s2;
  12. mp[s1]=s2;
  13. }
  14. for(int i=0;i<m;i++){
  15. if(i!=0)
  16. cout<<endl;
  17. string s;
  18. cin>>s;
  19. //1.是已知等级的饮料
  20. if(mp.count(s)){
  21. cout<<mp[s];
  22. }else{
  23. //2.由两个数组成
  24. int cnt=0; //表示匹配的次数
  25. string ans;
  26. for(int i=1;i<s.size();i++){
  27. string s1=s.substr(0,i);
  28. string s2=s.substr(i);
  29. if(mp.count(s1)&&mp.count(s2)){ //正确拆分
  30. cnt++;
  31. ans=mp[s1]+mp[s2];
  32. }
  33. }
  34. if(cnt==0||cnt>1)
  35. cout<<"D";
  36. else cout<<ans;
  37. }
  38. }
  39. return 0;
  40. }

count用来统计是否存在在该键值对的键里面。

3. 骰子游戏

4. 相对论大师

输入样例:

  1. 5
  2. Yu 0 Yuci 0
  3. Rou 1 Yu 1
  4. Yuci 0 Rou 1
  5. Yuci 0 Gutou 0
  6. Gutou 0 Rou 0

输出样例:

Yu 0 Yuci 0 Yuci 0 Rou 1 Rou 1 Yu 1 = Yu 0 Yu 1

具体代码实现:

构图+bfs深度遍历

  1. //思路:
  2. //构图:yu 0为一个整体
  3. //bfs找最短路径
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. const int N=1100;
  7. int n; //推论有n条,点有n+1个
  8. map<string,vector<string> >f; //存储有向图关系
  9. map<string,int> vis;
  10. map<string,string> pre;
  11. vector<string> s; //存储具体路径
  12. //求最短路径
  13. int bfs(string st,string ed){
  14. queue<string> q;
  15. for(auto& x:vis){
  16. x.second=-1;
  17. }
  18. vis[st]=0;
  19. q.push(st);
  20. while(!q.empty()){
  21. string x=q.front();
  22. q.pop();
  23. if(x==ed){
  24. return 1;
  25. }
  26. vector<string> v=f[x];
  27. for(int i=0;i<v.size();i++){
  28. if(vis[v[i]]==-1){
  29. vis[v[i]]=vis[x]+1;
  30. pre[v[i]]=x;
  31. q.push(v[i]);
  32. }
  33. }
  34. }
  35. return -1;
  36. }
  37. int main(void){
  38. cin>>n;
  39. //1.构图
  40. for(int i=0;i<n;i++){ //n行
  41. string a,b,c,d;
  42. cin>>a>>b>>c>>d;
  43. string s1=a+" "+b;
  44. string s2=c+" "+d;
  45. f[s1].push_back(s2);
  46. vis[s1]=-1,vis[s2]=-1;
  47. }
  48. //2.穷举
  49. string nst,ned; //最终开始点和终点
  50. int nd=2000; //最终最短长度
  51. for(auto x:vis){
  52. string st=x.first;
  53. char t=(st[st.size()-1]=='0')?'1':'0';
  54. string ed=st.substr(0,st.size()-1)+t;
  55. if(vis.count(ed)){ //存在终点
  56. if(bfs(st,ed)!=-1)
  57. if(nd>vis[ed]){
  58. nd=vis[ed];
  59. nst=st;
  60. ned=ed;
  61. }
  62. }
  63. }
  64. //3.求具体路径
  65. bfs(nst,ned);
  66. s.push_back(ned);
  67. string t=ned;
  68. while(t!=nst){
  69. t=pre[t];
  70. s.push_back(t);
  71. }
  72. reverse(s.begin(),s.end());
  73. for(int i=0;i<s.size();i++){
  74. if(i!=0) cout<<" ";
  75. cout<<s[i];
  76. if(i>0&&i<s.size()-1){
  77. cout<<" "<<s[i];
  78. }
  79. }
  80. cout<<" = "+nst+" "+ned<<endl;
  81. return 0;
  82. }

5. 相对成功与相对失败 

 输入样例:

  1. 3
  2. 5
  3. 1 0
  4. 1 0
  5. 0 0
  6. 0 0
  7. 0 1
  8. 1 2 3 4 5
  9. 5
  10. 1 0
  11. 1 0
  12. 0 0
  13. 0 0
  14. 0 1
  15. 5 4 3 2 1
  16. 5
  17. 1 0
  18. 0 1
  19. 0 0
  20. 0 1
  21. 1 1
  22. 4 2 1 3 5

  输出样例:

  1. 0
  2. 3
  3. 2

具体代码实现:

  1. //思路:我们可以计算一个得分,不玩手机和参加比赛各加一分
  2. //根据所给排序可以得到得分序列(逆序),因为必须是一个不下降子序列
  3. //我们可以把这个的最长不下降子序列求出来,然后用序列的长度-最长,就是不符合要求的
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. const int N=1e5+10;
  7. int n;
  8. int a[N],f[N]; //按顺序存储每个人的得分,所给顺序存储
  9. int dp[N]; //dp[i]表示以i为最长序列的最小尾数
  10. int main(void){
  11. int t;
  12. cin>>t;
  13. for(int i=1;i<=t;i++){
  14. memset(a,0,sizeof(a));
  15. cin>>n;
  16. //1.获得得分
  17. for(int i=1;i<=n;i++){
  18. int temp=0;
  19. int b1,b2;
  20. cin>>b1>>b2;
  21. if(b1==1)
  22. temp++;
  23. if(b2==0)
  24. temp++;
  25. a[i]=temp;
  26. }
  27. //2.按所给顺序倒叙存储
  28. for(int i=n;i>0;i--){
  29. int b;
  30. cin>>b;
  31. f[i]=a[b];
  32. }
  33. //3.求最长不下降子序列(使用二分nlogn->因为是逆序存储)
  34. dp[1]=f[1];
  35. int res=1;
  36. //找第一个>f[i]的dp
  37. for(int i=2;i<=n;i++){
  38. int p=upper_bound(dp+1,dp+res+1,f[i])-dp;
  39. dp[p]=f[i];
  40. res=max(res,p);
  41. }
  42. if(i!=1) cout<<endl;
  43. cout<<n-res;
  44. }
  45. return 0;
  46. }

最后,附上题目链接:PTA | 程序设计类实验辅助教学平台 (pintia.cn)

都看到这了,点个赞再走吧!!!

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