题解 | #B-Card Game
A+B Problem
https://ac.nowcoder.com/acm/contest/120561/A
一、题目及输入输出描述如图所示
二、核心思路
如何让小苯获得最高分
首先,题中说的是,小苯的牌是可按任意顺序进行排序的,而小红的牌的顺序是固定不变的,因此,小苯获得最高分的方式,就是要在小红将手中最小的牌出掉前,将自己手中所有比这张牌大的牌都出掉(只要针对这张最小牌出就行)。因此,再分别输入两个人的牌后,找出小苯的牌中所有比小红的最小牌大的分为一组(为有效牌),剩下为无效牌。然后进行全排列,有效牌数量记为cnt,剩余为n-cnt,因为出牌时是有效牌先出,所以最终答案为cnt!*(n-cnt)!.
代码如下
```#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
vector<int> jc(200005, 0);
signed main() {
int T;
cin >> T;
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
jc[0] = jc[1] = 1;
for (int i = 2; i <= 200005; i++)
jc[i] = jc[i - 1] * i % mod;
for (int i = 0; i < T; i++) {
int n;
cin >> n;
vector<int> a(n + 2, 0);
vector<int> b(n + 2, 0);
for (int j = 0; j < n; j++)
cin >> a[j];
int mn = 2 * n + 5;
for (int j = 0; j < n; j++) {
cin >> b[j];
if (b[j] < mn) {
mn = b[j];
}
}
int cnt = 0;
for (auto &p : a)
if (p > mn)
cnt++;
if (cnt == 0) {
cout << jc[n] << "\n";
} else
cout << jc[cnt]*jc[n - cnt] % mod << "\n";
}
}
如有错误或漏洞请指出
