fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main() {
  6. int T;
  7. cin >> T; // 测试用例数量
  8. while (T--) {
  9. int n;
  10. cin >> n; // 回合数
  11. vector<int> s(n); // Bob的出拳序列
  12. // 统计Bob出拳中0、1、2的数量
  13. int bob0 = 0, bob1 = 0, bob2 = 0;
  14. for (int i = 0; i < n; ++i) {
  15. cin >> s[i];
  16. if (s[i] == 0) bob0++;
  17. else if (s[i] == 1) bob1++;
  18. else bob2++;
  19. }
  20.  
  21. // Alice的出拳数量:a是0的数量,b是1的数量,c是2的数量
  22. int a, b, c;
  23. cin >> a >> b >> c;
  24.  
  25. int win = 0;
  26.  
  27. // 1. Alice用0打Bob的2
  28. int match = min(a, bob2);
  29. win += match;
  30. a -= match; // 剩余0的数量
  31. bob2 -= match; // 剩余Bob的2
  32.  
  33. // 2. Alice用1打Bob的0
  34. match = min(b, bob0);
  35. win += match;
  36. b -= match; // 剩余1的数量
  37. bob0 -= match; // 剩余Bob的0
  38.  
  39. // 3. Alice用2打Bob的1
  40. match = min(c, bob1);
  41. win += match;
  42. c -= match; // 剩余2的数量
  43. bob1 -= match; // 剩余Bob的1
  44.  
  45. // 4. 剩余的 Alice 出拳和 Bob 的出拳进行匹配(逆向匹配)
  46. // 4.1 Alice用剩余的0去打Bob的1
  47. match = min(a, bob1);
  48. win += match;
  49. a -= match; // 剩余0的数量
  50. bob1 -= match; // 剩余Bob的1
  51.  
  52. // 4.2 Alice用剩余的1去打Bob的2
  53. match = min(b, bob2);
  54. win += match;
  55. b -= match; // 剩余1的数量
  56. bob2 -= match; // 剩余Bob的2
  57.  
  58. // 4.3 Alice用剩余的2去打Bob的0
  59. match = min(c, bob0);
  60. win += match;
  61.  
  62. cout << win << endl;
  63. }
  64. return 0;
  65. }
  66.  
Success #stdin #stdout 0s 5324KB
stdin
3
5
01201
221
3
222
300
4
0122
112
stdout
5
5
5