思路:

  1. 输入处理与排序 读取测试用例数 t,循环处理每个用例; 读取牌的数量 n,定义两个数组 xh(小红的牌)、xb(小苯的牌),分别读取两人的牌; 将两人的牌都从小到大排序(这一步是竞赛中处理此类问题的常规操作,但后续逻辑用错了)。
  2. 统计 “无效牌” 数量 cnt 遍历小苯的牌 xb,统计其中小于小红最小牌 xh[0] 的牌的数量,记为 cnt(你认为这些牌是 “必输牌”); 剩余 num = n - cnt 张牌被你认定为 “有效牌”(大于等于小红最小牌)。
  3. 计算排列数 你认为:“必输牌” 的全排列数 × “有效牌” 的全排列数 = 达到最高得分的排列数; 分别计算 cnt!(a)和 num!(b),取模后相乘得到最终答案。

代码:

#include <bits/stdc++.h> using namespace std;

int main(){ int t; cin>>t; while(t--){ int n; cin>>n; vectorxh(n); vectorxb(n); for(int i=0;i<n;++i){ cin>>xb[i]; } for(int i=0;i<n;++i){ cin>>xh[i]; } sort(xh.begin(),xh.end()); sort(xb.begin(),xb.end()); int cnt=0; for(int i=0;i<n;++i){ if(xb[i]>=xh[0]){ break; } else{ cnt++; } } int num=n-cnt; long long a=1,b=1,ans; for(int i=cnt;i>0;--i){ a*=i; a=a%998244353; } for(int i=num;i>0;--i){ b*=i; b=b%998244353; } ans=a%998244353*b%998244353; cout<<ans<<endl; } return 0; }