题解 | #B-Card Game

A+B Problem

https://ac.nowcoder.com/acm/contest/120561/A

一、题目及输入输出描述如图所示 alt 二、核心思路

如何让小苯获得最高分

首先,题中说的是,小苯的牌是可按任意顺序进行排序的,而小红的牌的顺序是固定不变的,因此,小苯获得最高分的方式,就是要在小红将手中最小的牌出掉前,将自己手中所有比这张牌大的牌都出掉(只要针对这张最小牌出就行)。因此,再分别输入两个人的牌后,找出小苯的牌中所有比小红的最小牌大的分为一组(为有效牌),剩下为无效牌。然后进行全排列,有效牌数量记为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";
	}
}

如有错误或漏洞请指出
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务