B_cardgame题解
解题思路
这条题目很有意思,我一开始以为是田忌赛马类型的题目,也就是小红小明不管输赢都要进行弃牌的这样一个操作,结果wa了10次,后面跟实验室学长沟通才发现,原来只有赢的人要弃牌。在经过我的钛合金大脑思考过后(实则为无数次穷举)我发现了这个规则后面一个不合理的点,我只要把最小的牌放前面,不管后面有没有大牌,都走不掉(也就是无法得到point)而只要我把比小红最小的牌大的牌放在比小红最小牌小的牌的前面,我比他大的牌不管怎么样排都能走掉,而找到有多少张比小红最小的牌大的牌就是这条题目的解题关键。
用到方法
这条题目实则用到了sort排序和vector数组以及最重要的取模的意识,在阶乘阶段就要进行取模,否则在最后取模会职业45%的通过率(不要问我为什么知道) #示例代码
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vector<int>xh(n);
vector<int>xb(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;
}

查看10道真题和解析