这是第一天的一道题,yzh dalao把它归为比较难的一道题目,蒟蒻的我就来看一看,我会告诉你我会打麻将吗
题目链接:https://www.luogu.org/problemnew/show/P4050
首先先介绍一些麻将的知识(个人理解,若有误请见谅)
听牌:woc我马上就要胡牌了,还剩一张牌就可以胡,那么就说我们在“听”这张牌
对子,刻子,顺子,就像斗地主里的对牌,顺子一样
首先先枚举听牌,然后枚举对子,再枚举刻子,用一个e数组来存储现在的状态
那么我们有
e[j]%=3;
e[j+1]-=e[j];
e[j+2]-=e[j];
当e[j]<0时说明这张牌不是我们要听的牌
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t[1000010],e[1000010];
bool flag=false;
int n=0,m=0;
bool check()
{
for(int i=1;i<=n;i++)
{
if(t[i]>=2)
{
bool ju=true;
t[i]-=2;
for(int j=1;j<=n+2;j++)
{
e[j]=t[j];
}
for(int j=1;j<=n+2;j++)
{
if(e[j]<0)
{
ju=false;
break;
}
e[j]%=3;
e[j+1]-=e[j];
e[j+2]-=e[j];
}
t[i]+=2;
if(ju==true)
{
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=3*m+1;i++)
{
int x=0;
scanf("%d",&x);
t[x]++;
}
for(int i=1;i<=n;i++)
{
t[i]++;
memset(e,0,sizeof(e));
if(check()==true)
{
flag=true;
printf("%d ",i);
}
t[i]--;
}
if(flag==false)
{
printf("NO");
}
return 0;
}