D. Card Game
所有相同字母不同数字的卡牌都可以同时成对输出。
所以需要判断有多少不同字母卡牌只剩下单独一张的cnt,这种卡牌只能和王牌来同时输出。
判断cnt如果大于王牌个数,那么结果就是impossible的
存储本题的输入数据可以使用map配合priority_queue,优先队列实现自动排序,那么在输出时可以把小的数先输出,这样前面输出的卡牌一定比后面输出的卡牌数字小。
#include<iostream>
#include<map>
#include<queue>
using namespace std;
int main(){
int T;cin>>T;
while(T--){
int n;cin>>n;
char c;cin>>c;
map<char,priority_queue<char,vector<char>,greater<char>>>mp;
for(int i=1;i<=2*n;i++){
string ss;cin>>ss;
mp[ss[1]].push(ss[0]);
}
int cnt=0;
for(auto x:mp){
if(x.first==c) continue;
cnt+=x.second.size()%2;
}
if(cnt>mp[c].size()){
cout<<"IMPOSSIBLE\n";
continue;
}
for(auto x:mp){
if(x.first==c) continue;
while(x.second.size()>=2){
cout<<x.second.top()<<x.first<<' ';
x.second.pop();
cout<<x.second.top()<<x.first;
x.second.pop();
cout<<endl;
}
if(x.second.size()){
cout<<x.second.top()<<x.first<<' ';
x.second.pop();
cout<<mp[c].top()<<c;
mp[c].pop();
cout<<endl;
}
}
while(mp[c].size()){
cout<<mp[c].top()<<c<<' ';
mp[c].pop();
cout<<mp[c].top()<<c;
mp[c].pop();
cout<<endl;
}
}
}