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. for (int i = 0; i < 3; ++i) {
  35. for (int j = 0; j < 3; ++j) {
  36. // Alice 的出拳比 Bob 的出拳大且 Bob 的该出拳仍有剩余
  37. if (alice_scores[i] > j && bob_count[j] > 0) {
  38. win_count++;
  39. bob_count[j]--;
  40. break; // 一旦匹配成功,跳到 Alice 的下一个出拳
  41. }
  42. }
  43. }
  44.  
  45. // 输出当前测试用例的 Alice 获胜的次数
  46. cout << win_count << endl;
  47. }
  48.  
  49. return 0;
  50. }
  51.  
Success #stdin #stdout 0.01s 5276KB
stdin
3
5
01201
221
3
222
300
4
0122
112
stdout
0
3
3