题解:
#include <iostream> #include <queue> //需要用小根堆的优先队列 #include <unordered_map> //用无序映射 using namespace std; bool pai() { int n, m; cin >> n >> m; priority_queue<int, vector<int>, greater<int>>q; //用来往里面存牌 unordered_map<int, int>arr; //记录每张牌的个数 while (n--) { int num; cin >> num; //输入当前的牌 arr[num]++; //将当前牌的数量加1 q.push(num); //往优先队列里插入该牌 } while (!q.empty()) //根据队列里面个数去循环(只要队列不为空就循环) { int number = q.top(); //将队列的堆顶元素(最小值)记录下来 q.pop(); //必须得先弹出再去判断这个牌的数量 if (arr[number] == 0) continue; //如果当前牌的个数为0,则开始下一次循环 for (int i = 0; i < m; i++) //根据每组顺子的长度去循环 { int cnt = arr[number+i]--; //用cnt记录当前牌的个数,记录后,就让当前牌个数-1,因为当前牌构成了顺子,且索引是number+i,因为只有连着的才能构成顺子 if (cnt == 0) return false; //如果要构成顺子的该牌数量为0,则表示无法构成顺子,返回false } } return true; //若能顺利构成若干组m长度的顺子,则返回true } int main() { int t; cin >> t; while (t--) { if (pai()) cout << "YES" << endl; else cout << "NO" << endl; } }
参考(来自学长们题解):
资料:
c++ unordered_map和map的区别-CSDN博客
C++ map与unordered_map区别及使用_c++中的map和unordered_map的区别和使用场景-CSDN博客