• C++基础知识(二十五)--- STL案例之演讲比赛


    问题:

    24个人,分4组,每组6人,三轮比赛,每轮淘汰一半。第三轮6人决出前三名。

    10个评委打分,选手最终得分是去掉最高最低取平均。

    思路:

    (1)用 vector 存储编号,编号对应选手;

    (2)用 map 保存选手信息(键值是编号,实值是选手);

    (3)每一轮结果存储到 vector 中,只保存选手的编号;

    流程:

    (1)创建选手

    (2)第一轮比赛:抽签,比赛,打印本轮晋级选手名单

    (3)第二轮比赛:抽签,比赛,打印本轮晋级选手名单

    (4)第三轮比赛:抽签,比赛,打印本轮晋级选手名单

    比赛:

    (1)学生成绩存储到 deque 容器中,计算出分数;

    (2)评比

    1. //定义比赛选手
    2. class Player
    3. {
    4. public:
    5. string name;
    6. int age;
    7. int mScore[3]; //三轮比赛成绩
    8. };
    9. //创建选手
    10. void CreatePlayer(vector<int>& v1, map<int, Player>& mlist)
    11. {
    12. string setName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    13. for (int i = 0; i < 24; i++)
    14. {
    15. //创建选手
    16. Player p;
    17. p.name = "选手";
    18. p.name += setName[i];
    19. p.age = 20;
    20. for (int j = 0; j < 3; j++)
    21. {
    22. p.mScore[j] = 0;
    23. }
    24. //生成选手编号
    25. int ID = 100 + i;
    26. //保存选手编号
    27. v1.push_back(ID);
    28. //保存选手信息
    29. mlist.insert(make_pair(ID, p));
    30. }
    31. }
    32. //抽签
    33. void PlayerByRandom(vector<int>& v)
    34. {
    35. random_shuffle(v.begin(), v.end());
    36. }
    37. //比赛
    38. void StartMatch(int index, vector<int>& v1, map<int, Player>& mlist, vector<int>& v2)
    39. {
    40. //定义multimap容器,键值是分数,实值是选手编号
    41. multimap<int, int, greater<int>> mGroups;
    42. for (vector<int>::iterator sit = v1.begin(); sit != v1.end(); ++sit)
    43. {
    44. //保存分数
    45. deque<int> dScore;
    46. for (int i = 0; i < 10; i++)
    47. {
    48. int score = rand() % 50 + 50;
    49. dScore.push_back(score);
    50. }
    51. //排序
    52. sort(dScore.begin(), dScore.end());
    53. //去掉最高最低分
    54. dScore.pop_back();
    55. dScore.pop_front();
    56. //求总分
    57. int tScore = accumulate(dScore.begin(), dScore.end(), 0);
    58. //求平均分
    59. int avgScore = tScore / dScore.size();
    60. //保存到选手信息中
    61. mlist[*sit].mScore[index - 1] = avgScore;
    62. //把选手放到multimap容器中
    63. mGroups.insert(make_pair(avgScore, *sit));
    64. //评比
    65. if (mGroups.size() == 6)
    66. {
    67. //容器中一共有6人,去掉后三名
    68. int cnt = 0;
    69. for (multimap<int, int, greater<int>>::iterator it = mGroups.begin(); it != mGroups.end() && cnt < 3; cnt++, ++it)
    70. {
    71. v2.push_back(it->second);
    72. }
    73. //清空容器
    74. mGroups.clear();
    75. }
    76. }
    77. }
    78. //打印本轮晋级选手的名单
    79. void ShowPlayerScore(int index, vector<int>& v, map<int, Player>& mlist)
    80. {
    81. cout << "第 " << index << " 轮晋级名单:" << endl;
    82. for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    83. {
    84. cout << "Name: " << mlist[*it].name << " Age: " << mlist[*it].age << " Score: " << mlist[*it].mScore[index - 1] << endl;
    85. }
    86. }
    87. void test33()
    88. {
    89. srand((unsigned int)time(NULL));
    90. vector<int> v1; //保存选手编号
    91. map<int, Player> mlist; //保存选手信息
    92. vector<int> v2; //保存第一轮晋级选手的编号
    93. vector<int> v3; //第二轮
    94. vector<int> v4; //第三轮
    95. //创建选手
    96. CreatePlayer(v1, mlist);
    97. //第一轮
    98. //1.抽签
    99. PlayerByRandom(v1);
    100. //2.比赛
    101. StartMatch(1, v1, mlist, v2);
    102. //3.打印本轮晋级选手的名单
    103. ShowPlayerScore(1, v2, mlist);
    104. //第二轮
    105. //1.抽签
    106. PlayerByRandom(v2);
    107. //2.比赛
    108. StartMatch(2, v2, mlist, v3);
    109. //3.打印本轮晋级选手的名单
    110. ShowPlayerScore(2, v3, mlist);
    111. //第一轮
    112. //1.抽签
    113. PlayerByRandom(v3);
    114. //2.比赛
    115. StartMatch(3, v3, mlist, v4);
    116. //3.打印本轮晋级选手的名单
    117. ShowPlayerScore(3, v4, mlist);
    118. }

  • 相关阅读:
    使用晶体管做布尔逻辑和逻辑门
    androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边
    LeetCode50天刷题计划第二季(Day 29 — 寻找峰值(11.10-12.10)
    [架构之路-254/创业之路-85]:目标系统 - 横向管理 - 源头:信息系统战略规划的常用方法论,为软件工程的实施指明方向!!!
    基于javaweb+mysql的SSH校园二手交易平台
    记一次线上问题,拿到的不是最新的数据 → 偶尔的热情真的难顶呀!
    网络基本概念
    http 请求 Cros 跨域问题记录(转)
    【洛谷】P2661 信息传递
    CocosCreator 面试题(十一)Cocos Creator 屏幕适配
  • 原文地址:https://blog.csdn.net/woshizuopie/article/details/126477464