当前位置:   article > 正文

XTU OJ String game_和 正在玩一款游戏。 初始有一个长度为 字符串,仅包括 和 两种字符,对于每个位置

和 正在玩一款游戏。 初始有一个长度为 字符串,仅包括 和 两种字符,对于每个位置

Alice和Bob正在玩一个基于字符串的游戏,一开始,Alice和Bob分别拥有一个等长的字符串S1和S2,且这两个字符串只包含小写字母。 在每个回合中,Alice和Bob必须分别选择自己的字符串的某一个位置并把这个位置上的字母改变为其他小写字母。 经过P个回合后,他们的得分分别等于自己的字符串中出现最多的字母出现的次数。 最终得分高者获胜,如果两人得分相等,则为平局。 现在你知道了初始的两个字符串S1、S2和回合数P,如果两人都以最优策略游戏,请问最后谁能获胜或者结果是平局。

输入

第一行是一个数T(1≤T≤100000),表示样例的个数。 然后每个样例第一行两个数字,分别是字符串长度N和回合数P,(1≤N≤100,0≤P≤109)。 接下来两行是两个字符串S1,S2,分别是Alice和Bob的初始字符串。

输出

对于每个样例,输出一行。如果Alice能获胜,输出"Alice",如果结果是平局,输出"Draw",否则输出"Bob"。

样例输入

4
6 2
xxxttu
xxttuu
6 5
xxxttu
xxttuu
6 3
xtuxtu
xxttuu
4 0
alic
ebob

样例输出

Alice
Draw
Draw
Bob

思路分析:这道题的下手点就是要代入,代入其中一个人,想着你要赢应该怎么做。

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include<cstring>
  4. using namespace::std;
  5. int main()
  6. {
  7. int k;
  8. scanf("%d", &k);
  9. while (k--)
  10. {
  11. /*因为不可能进行模拟,因为变的哪个字符都不同
  12. 我们应该做的就是才用极值的方法进行放缩
  13. 为什么会这样想?因为假如我是ALICE,我和bob回合数都是一样的
  14. 那么如果我要想赢,就必须想尽办法得到最高分,也就是说
  15. 我们只需要对最高分就行比较,只要alice最高分大于bob最高分
  16. 那么alice就一定赢
  17. 我是不是就应该打好我手中的牌?利用
  18. 我这个字符串中最多的字符,然后在规定的回合数内把这个最多的字符的优势扩到最大
  19. 因此,我们的思路是首先找到哪个字母出现的次数最多
  20. */
  21. int n, p;//n为字符总数,p为回合数
  22. scanf(" %d %d", &n, &p);
  23. char s1[101];
  24. char s2[101];
  25. int a[30]={0}, b[30]={0};//用来记录每个字符串中每个字符出现的个数
  26. int countalicemax = 0, countbobmax = 0;//用来记录两个字符串中的极大值
  27. scanf("%s", s1);
  28. scanf("%s", s2);
  29. for (int i = 0; i < n; i++) {
  30. a[s1[i] - 'a']++;//记录各个字母出现的次数
  31. if (a[s1[i] - 'a'] > countalicemax) {
  32. countalicemax = a[s1[i] - 'a'];
  33. }
  34. b[s2[i] - 'a']++;
  35. if (b[s2[i] - 'a'] > countbobmax) {
  36. countbobmax = b[s2[i] - 'a'];
  37. }
  38. }
  39. int scorealice = 0, scorebob = 0;
  40. //注意一下特殊情况
  41. if (countalicemax == n) {//如果说全部字母都相同
  42. if (p == 1) {//只有一个回合
  43. scorealice = n - 1;//因为字符全部相同,而又必须要变动字符,
  44. //那么就必须把总分-1
  45. }
  46. else
  47. scorealice = n;//这个地方就相当有难度了,只要回合数不为1且全部字符相同
  48. //那么总有办法变回原来的形态,也就是说你要赢,就必须想尽办法得到最高分
  49. }
  50. else if (p >= n - countalicemax) //当回合数>剩余的字符长度
  51. {
  52. scorealice = n;//因为回合数超了后,我们就可以变回最高分的状态
  53. }
  54. else {
  55. scorealice = p + countalicemax;
  56. }
  57. if (countbobmax == n) {//如果说全部字母都相同
  58. if (p == 1) {//只有一个回合
  59. scorebob = n - 1;//因为字符全部相同,而又必须要变动字符,
  60. //那么就必须把总分-1
  61. }
  62. else {
  63. scorebob = n;//这个地方就相当有难度了,只要回合数不为1且全部字符相同
  64. //那么总有办法变回原来的形态,也就是说你要赢,就必须想尽办法得到最高分
  65. }
  66. }
  67. else if (p >= n - countbobmax) //当回合数>剩余的字符长度
  68. {
  69. scorebob = n;//因为回合数超了后,我们就可以变回最高分的状态
  70. }
  71. else scorebob = p + countbobmax;
  72. if (scorealice > scorebob)
  73. {
  74. printf("Alice\n");
  75. }
  76. else if (scorealice < scorebob) {
  77. printf("Bob\n");
  78. }
  79. else
  80. {
  81. printf("Draw\n");
  82. }
  83. }
  84. }

 

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

闽ICP备14008679号