题解:P13733 [JOIGST 2025] 扑克 / Poker

· · 题解

题目大意

再给出的 N 张牌中,找到长度为 K 的顺子。题目中给出的顺子的定义是:

  • 将这些扑克牌按照牌上的正整数从小到大排序后,任意相邻两张牌上的正整数差为 1

思路分析

比较相邻的两个数字,看它们的差值是否为 1。为了确保顺子的单调递增或单调递减性,在处理数字之前需要先排序。由于相同的牌既不能帮助组成顺子,也不会影响结果。所以为了方便,可以将数组去重。

AC Code


#include<bits/stdc++.h>
using namespace std;
//#define int long long 
const int N=3e5+1013;
set <int> s;//利用set去重 
int a[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,k,x;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>x;
s.insert(x);
}
int i=1;
for(set<int>::iterator it=s.begin();it!=s.end();it++,i++){
a[i]=*it;
}//set自动从小到大排序,所以我这里就不用排序了
int cnt1=1,cnt2=0;//cnt1:当前最长顺子的长度  cnt2:最长顺子的长度 
for(int i=1;i<=n;i++){
if(a[i]+1==a[i+1]) cnt1++;
else cnt2=max(cnt2,cnt1), cnt1=1;
}
if(cnt2>=k) cout<<"Yes";
else cout<<"No";
return 0;
}