专栏文章
题解:P13733 [JOIGST 2025] 扑克 / Poker
P13733题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioao7ag
- 此快照首次捕获于
- 2025/12/02 16:06 3 个月前
- 此快照最后确认于
- 2025/12/02 16:06 3 个月前
观察到一个性质,这个牌组为顺子当且仅当它在排完序的数组里面正好是公差为 ,项数为 的等差数列,很容易证明。
然后只要询问这样的等差数列存不存在就可以了。
对于这样的询问,我们考虑排序后的数组 。
假设我们当前遍历到第 个数。
如果 ,那么最长的顺子的长度就加 1。如果加后,这个最长的顺子的长度达到 ,那么就存在这样一个数列。
如果 ,那么最长的顺子的长度不会增加,因为我们可以选 ,也可以选 ,其中 是当前的顺子的长度, 是第 个选出的数的编号。所以这种情况没有变化。
如果 ,那么最长的顺子的长度就会到此终止,需要重新从 开始计算最长顺子长度。
这样,如果最后还没有找到顺子长度等于 的一种,那么就不存在,注意我们从 开始遍历,因为 不一定等于 。
Code:
CPP#include<bits/stdc++.h>
using namespace std;
const int N=300009;
int a[N];
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int cnt=1;
for(int i=2;i<=n;i++)
if(a[i]==a[i-1]+1){
cnt++;
if(cnt==k){
cout<<"Yes"<<endl;
return 0;
}
}
else if(a[i]==a[i-1]) continue;
else cnt=1;
cout<<"No"<<endl;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...