• [模拟]攻略分队 2022RoboCom省赛D


    副本是游戏里的一个特色玩法,主要为玩家带来装备、道具、游戏资源的产出,满足玩家的游戏进程。

    在 MMORPG《最终幻想14》里,有一个攻略人数最大达到 56 人的副本“巴尔德西昂兵武塔”,因为有在副本里死亡不能复活、机制比较整蛊等特点,一度被玩家视作洪水猛兽。

    在副本的开始,我们会遇到第一个难关:攻略的玩家要分为两组,同时讨伐副本 BOSS “欧文”和“亚特”。

    已知以下信息:

    1. 玩家会组成 6 支队伍进入副本,其中第 i 队有 Vi​ 位玩家(i=1,⋯,6)。
    2. 每支队伍可能会有一些特殊角色:MT(主坦克)、工兵(负责探测陷阱)和指挥(负责指挥玩家)。

    我们的任务是合理安排玩家的分组,以最大程度增加副本通过概率。分组的原则如下:

    1. 要将所有队伍分成 2 组,每支队伍必须且仅属于其中一组;
    2. 每组必须有至少一个 MT(主坦克)。

    如果满足上述原则的分组方案不唯一,则按照下列规则确定唯一解:

    1. 优先选择每组有至少一个指挥和至少一个工兵的方案;
    2. 如果规则 1 无法满足,则优先选择每组至少有一个指挥的方案;
    3. 如果所有方案都不满足规则 2,或经过前 2 个规则筛选后,分组方案仍不唯一,则选择两边人数尽可能接近(即两边人数差尽可能小)的方案;
    4. 如果满足规则 3 的方案还不唯一,选择讨伐“欧文”的人数大于等于讨伐“亚特”的人数的方案;
    5. 如果满足规则 4 的方案还不唯一,选择讨伐“欧文”的队伍编号方案中最小的一个。

    注:一个队伍编号方案 A={a1​<⋯

    本题就请你给出满足所有分组原则的分配方案。

    感谢 王宪泉 同学对规则 4 的指正,于 2022-08-04 修改

    输入格式:

    输入第一行给出 6 支队伍的玩家数量,即 6 个非负整数 Vi​ (0≤Vi​≤8,1≤i≤6)。队伍人数为 0 时表示队伍不存在。

    随后 6 行,按队伍编号顺序,每行给出一支队伍的特殊角色,格式为 ABC,其中 A 对应 MT,B 对应工兵,C 对应指挥。三种角色对应取值 0 或 1,0 表示没有该角色,1 表示有。

    注:由于可能存在一人兼任多个特殊角色的情况,所以一支队伍中的特殊角色数量有可能大于该队伍的玩家数量。

    输出格式:

    输出分两行,第一行输出讨伐“欧文”的队伍编号,第二行输出讨伐“亚特”的队伍编号。同一行中的编号按升序输出,以 1 个空格分隔,行首尾不得有多余空格。

    如果不存在合法的方案,输出GG

    输入样例1:

    1. 6 8 7 5 3 0
    2. 010
    3. 101
    4. 110
    5. 001
    6. 111
    7. 000

    输出样例1:

    1. 2 3
    2. 1 4 5

    输入样例2:

    1. 6 8 7 5 3 0
    2. 010
    3. 101
    4. 010
    5. 001
    6. 011
    7. 000

    输出样例2:

    GG

    题意: 根据题目中给出的各种规则,将若干队伍分为两组,若存在方案输出分组方案,否则输出GG。

    分析: 这道题目是一道比较麻烦的模拟题,可以先处理下每个队伍是否有MT、工兵和指挥,然后二进制枚举0~1<<6,对于枚举出来的一个数字就代表一种分组方案,这里我假设为1的位是讨伐欧文的队伍,为0的位是讨伐亚特的队伍,首先先找出来两组都包含MT的分组,如果不存在那么说明无解,如果分组唯一那就直接输出,如果分组不唯一就再遍历找出两组均有指挥和工兵的分组方案,如果不存在的话就只考虑指挥,之后就根据题目中的描述模拟就行,要严格按照题目中说的来,另外题面中规则4后来进行了修改,应该是讨伐“欧文”的人数大于等于讨伐“亚特”的人数而不是之前说的的大于

    具体代码如下:

    1. #include
    2. #define inf 0x3f3f3f3f
    3. using namespace std;
    4. int num[10];
    5. bool mt[10];
    6. bool gb[10];
    7. bool zh[10];
    8. void Output(int i);
    9. signed main(){
    10. for(int i = 0; i < 6; i++)
    11. scanf("%d", &num[i]);
    12. for(int i = 0; i < 6; i++){
    13. string s;
    14. cin >> s;
    15. mt[i] = (s[0]=='1');
    16. gb[i] = (s[1]=='1');
    17. zh[i] = (s[2]=='1');
    18. }
    19. vector<int> alls;
    20. for(int i = 0; i < (1<<6); i++){
    21. if(i == 0 || i == (1<<6)-1) continue;
    22. bool mt1 = false, mt2 = false;
    23. for(int j = 0; j < 6; j++){
    24. if(i&(1<
    25. mt1 = max(mt1, mt[j]);
    26. else if(!(i&(1<
    27. mt2 = max(mt2, mt[j]);
    28. }
    29. if(mt1 && mt2) alls.push_back(i);
    30. }
    31. if(alls.size() > 1){
    32. vector<int> t1;
    33. for(int i = 0; i < alls.size(); i++){
    34. bool gb1 = false, gb2 = false, zh1 = false, zh2 = false;
    35. for(int j = 0; j < 6; j++){
    36. if(alls[i]&(1<
    37. gb1 = max(gb1, gb[j]);
    38. zh1 = max(zh1, zh[j]);
    39. }
    40. else if(!(alls[i]&(1<
    41. gb2 = max(gb2, gb[j]);
    42. zh2 = max(zh2, zh[j]);
    43. }
    44. }
    45. if(gb1 && gb2 && zh1 && zh2) t1.push_back(alls[i]);
    46. }
    47. if(t1.size() == 0){
    48. for(int i = 0; i < alls.size(); i++){
    49. bool zh1 = false, zh2 = false;
    50. for(int j = 0; j < 6; j++){
    51. if(alls[i]&(1<
    52. zh1 = max(zh1, zh[j]);
    53. }
    54. else if(!(alls[i]&(1<
    55. zh2 = max(zh2, zh[j]);
    56. }
    57. }
    58. if(zh1 && zh2) t1.push_back(alls[i]);
    59. }
    60. }
    61. if(t1.size() == 1){
    62. int i = t1[0];
    63. Output(i);
    64. }
    65. else{
    66. vector<int> t2;
    67. if(t1.size() > 1){//多个满足前两规则的
    68. int _min = inf;
    69. for(int i = 0; i < t1.size(); i++){
    70. int n1 = 0, n0 = 0;
    71. for(int j = 0; j < 6; j++){
    72. if((t1[i]&(1<
    73. n1 += num[j];
    74. }
    75. else if(!(t1[i]&(1<
    76. n0 += num[j];
    77. }
    78. }
    79. if(n1 == 0 || n0 == 0) continue;
    80. _min = min(_min, abs(n1-n0));
    81. }
    82. for(int i = 0; i < t1.size(); i++){
    83. int n1 = 0, n0 = 0;
    84. for(int j = 0; j < 6; j++){
    85. if((t1[i]&(1<
    86. n1 += num[j];
    87. }
    88. else if(!(t1[i]&(1<
    89. n0 += num[j];
    90. }
    91. }
    92. if(n1 == 0 || n0 == 0) continue;
    93. if(abs(n1-n0) == _min) t2.push_back(t1[i]);
    94. }
    95. }
    96. else{//不存在满足第二个规则的,更不存在满足前两个的
    97. int _min = inf;
    98. for(int i = 0; i < alls.size(); i++){
    99. int n1 = 0, n0 = 0;
    100. for(int j = 0; j < 6; j++){
    101. if((alls[i]&(1<
    102. n1 += num[j];
    103. }
    104. else if(!(alls[i]&(1<
    105. n0 += num[j];
    106. }
    107. }
    108. if(n1 == 0 || n0 == 0) continue;
    109. _min = min(_min, abs(n1-n0));
    110. }
    111. for(int i = 0; i < alls.size(); i++){
    112. int n1 = 0, n0 = 0;
    113. for(int j = 0; j < 6; j++){
    114. if((alls[i]&(1<
    115. n1 += num[j];
    116. }
    117. else if(!(alls[i]&(1<
    118. n0 += num[j];
    119. }
    120. }
    121. if(n1 == 0 || n0 == 0) continue;
    122. if(abs(n1-n0) == _min) t2.push_back(alls[i]);
    123. }
    124. }
    125. if(t2.size() == 1){
    126. int i = t2[0];
    127. Output(i);
    128. }
    129. else{//t2.size()不可能为0
    130. vector<int> t3;
    131. for(int i = 0; i < t2.size(); i++){
    132. int n1 = 0, n0 = 0;
    133. for(int j = 0; j < 6; j++){
    134. if((t2[i]&(1<
    135. n1 += num[j];
    136. }
    137. else if(!(t2[i]&(1<
    138. n0 += num[j];
    139. }
    140. }
    141. if(n1 == 0 || n0 == 0) continue;
    142. if(n1 >= n0) t3.push_back(t2[i]);
    143. }
    144. if(t3.size() == 1){
    145. int i = t3[0];
    146. Output(i);
    147. }
    148. else if(t3.size() > 1){
    149. vectorint> > ans;
    150. for(int i = 0; i < t3.size(); i++){
    151. vector<int> temp;
    152. for(int j = 0; j < 6; j++){
    153. if((t3[i]&(1<
    154. temp.push_back(j+1);
    155. }
    156. }
    157. ans.push_back(temp);
    158. }
    159. sort(ans.begin(), ans.end());
    160. bool vis[10] = {false};
    161. printf("%d", ans[0][0]);
    162. vis[ans[0][0]-1] = true;
    163. for(int i = 1; i < ans[0].size(); i++){
    164. printf(" %d", ans[0][i]);
    165. vis[ans[0][i]-1] = true;
    166. }
    167. puts("");
    168. bool first = true;
    169. for(int i = 0; i < 6; i++){
    170. if(!vis[i] && num[i]){
    171. if(first){
    172. printf("%d", i+1);
    173. first = false;
    174. }
    175. else printf(" %d", i+1);
    176. }
    177. }
    178. }
    179. else{//欧文人数都比亚特少时无解
    180. puts("GG");
    181. return 0;
    182. }
    183. }
    184. }
    185. }
    186. else if(alls.size() == 1){
    187. int i = alls[0];
    188. Output(i);
    189. }
    190. else puts("GG");
    191. return 0;
    192. }
    193. void Output(int i){
    194. vector<int> ans1, ans2;
    195. for(int j = 0; j < 6; j++){
    196. if((i&(1<
    197. ans1.push_back(j+1);
    198. else if(!(i&(1<
    199. ans2.push_back(j+1);
    200. }
    201. printf("%d", ans1[0]);
    202. for(int j = 1; j < ans1.size(); j++)
    203. printf(" %d", ans1[j]);
    204. puts("");
    205. printf("%d", ans2[0]);
    206. for(int j = 1; j < ans2.size(); j++)
    207. printf(" %d", ans2[j]);
    208. }

  • 相关阅读:
    铁托(Tito)
    AIGC下一步:如何用AI再度重构或优化媒体处理?
    SSO 和 OAuth2.0 的关系是什么?
    软件测试面试必备,一文带你彻底掌握接口测试
    java建材公司管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    OSCP系列靶场-Esay-Moneybox保姆级
    【电商运营】如何吸引客户?经典WhatsApp营销案例分享!
    Python实时获取steam游戏数据
    【目标检测】YOLOX训练王者荣耀数据集
    Day4: 应用篇-1
  • 原文地址:https://blog.csdn.net/m0_55982600/article/details/126182578