题目描述:
输入描述:
输出描述:
这是一道思维题,本想着是田忌赛无脑入双指针,但是细细看来里面是有规律的,想要得分高,肯定是要让牌尽量出的多,当苯最小比红最小大的的时候,苯可将所有牌出掉,因为规则是数字大的牌移除并且双方手牌顺序不变,在红最小牌出现的时候即可全部出掉,反之,如果有比红最小的牌还小的牌一定出不掉,因为会被卡住,因此我们要将次作为分界线,找到第一个比最小牌小的出不掉的牌,令这张牌为k,比k大的都出的掉且分数最大(因为我们已经保证自己出的牌最多了,k会被卡住出不掉,更何况比k小的),接下来我们就要找到比k大的个数count,再用总数减去这个数就是出不掉的数n-count,分为左右两种,两边都为全排列即为阶乘,且互相独立,最终将出的掉的全排列X出不掉的全排列就是最终答案,最后不要忘记取模,最好乘一次取一次模。
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vector<int> a(n+1);
vector<int> b(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(b.begin(),b.end());
int count=0;
for(int i=1;i<=n;i++){
if(a[i]>b[1]){
count++;
}
}
long long sum=1;
for(int i=1;i<=count;i++){
sum=sum*i%998244353;
}
for(int i=1;i<=n-count;i++){
sum=sum*i%998244353;
}
cout<<sum<<endl;
}
return 0;
}

京公网安备 11010502036488号