fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. int main() {
  7. int T;
  8. cin >> T; // 输入测试用例数量
  9. while (T--) {
  10. int n;
  11. cin >> n; // 读取每个测试用例的回合数
  12. vector<int> s(n); // 存储 Bob 的出拳序列
  13. for (int i = 0; i < n; ++i) {
  14. cin >> s[i];
  15. }
  16.  
  17. // 读取 Alice 的出拳的三种可能的值
  18. int a, b, c;
  19. cin >> a >> b >> c;
  20.  
  21. // 对 Alice 的出拳进行排序
  22. vector<int> alice_scores = {a, b, c};
  23. sort(alice_scores.rbegin(), alice_scores.rend()); // 按从大到小排序
  24.  
  25. // 统计 Bob 出拳的频率
  26. vector<int> bob_count(3, 0); // Bob 的出拳 0, 1, 2 的计数
  27. for (int i = 0; i < n; ++i) {
  28. bob_count[s[i]]++;
  29. }
  30.  
  31. int win_count = 0;
  32.  
  33. // 贪心策略,尽可能选择 Alice 的较大分数来击败 Bob 的较小分数
  34. // 处理 Alice 的分数从最大到最小与 Bob 进行比较
  35. for (int i = 0; i < 3; ++i) {
  36. for (int j = 0; j < 3; ++j) {
  37. // Alice 的出拳比 Bob 的出拳大且 Bob 的该出拳仍有剩余
  38. if (alice_scores[i] > j && bob_count[j] > 0) {
  39. win_count++;
  40. bob_count[j]--; // Bob 用过一次该分数
  41. break; // 一旦匹配成功,跳到 Alice 的下一个出拳
  42. }
  43. }
  44. }
  45.  
  46. // 输出当前测试用例的 Alice 获胜的次数
  47. cout << win_count << endl;
  48. }
  49.  
  50. return 0;
  51. }
  52.  
Success #stdin #stdout 0.01s 5316KB
stdin
3
5
01201
221
3
222
300
4
0122
112
stdout
0
3
3