专栏文章

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

P13733题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioao7ag
此快照首次捕获于
2025/12/02 16:06
3 个月前
此快照最后确认于
2025/12/02 16:06
3 个月前
查看原文
观察到一个性质,这个牌组为顺子当且仅当它在排完序的数组里面正好是公差为 11,项数为 KK 的等差数列,很容易证明。
然后只要询问这样的等差数列存不存在就可以了。
对于这样的询问,我们考虑排序后的数组 aa
假设我们当前遍历到第 ii 个数。
如果 ai=ai1+1a_i=a_{i-1}+1,那么最长的顺子的长度就加 1。如果加后,这个最长的顺子的长度达到 KK,那么就存在这样一个数列。
如果 ai=ai1a_i=a_{i-1},那么最长的顺子的长度不会增加,因为我们可以选 ap1,ap2,,apcnt1,aia_{p_1},a_{p_2},\cdots,a_{p_{cnt-1}},a_i,也可以选 ap1,ap2,,apcnt1,ai1a_{p_1},a_{p_2},\cdots,a_{p_{cnt-1}},a_{i-1},其中 cntcnt 是当前的顺子的长度,pip_i 是第 ii 个选出的数的编号。所以这种情况没有变化。
如果 ai>ai1+1a_i>a_{i-1}+1,那么最长的顺子的长度就会到此终止,需要重新从 ii 开始计算最长顺子长度。
这样,如果最后还没有找到顺子长度等于 KK 的一种,那么就不存在,注意我们从 22 开始遍历,因为 a1a_1 不一定等于 11
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 条评论,欢迎与作者交流。

正在加载评论...