题目
作为一个优秀中学生,当然是不打麻将的呢233。
看一看题目描述,熟悉一下规则吧。
作为bzoj中的一道题,枚举也是需要思考的233。 先枚举听的牌,再枚举对子,剩下的看能不能全凑成顺子。
#include<bits/stdc++.h> #define N 500 using namespace std; int n,m; int cnt[N+1],x; int ans[N+1],len,tmp[N+1]; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int read() { int x=0,b=1; char c=nc(); for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1; for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0'; return x*b; } inline bool judge() { bool flag; for(int i=1;i<=n;i++) { if(cnt[i]<2)continue; cnt[i]-=2; flag=true; for(int j=1;j<=n+2;j++) tmp[j]=cnt[j]; for(int j=1;j<=n+2;j++) { if(tmp[j]<0) { flag=false; break; } tmp[j]=tmp[j]%3; tmp[j+1]-=tmp[j]; tmp[j+2]-=tmp[j]; } cnt[i]+=2; if(flag)return true; } return false; } int main() { //freopen("in.txt","r",stdin); n=read(),m=read(); for(int i=1;i<=3*m+1;i++)x=read(),cnt[x]++; for(int i=1;i<=n;i++) { cnt[i]++; if(judge())ans[++len]=i; cnt[i]--; } if(len==0)printf("NO"); else { for(int i=1;i<len;i++)printf("%d ",ans[i]); printf("%d",ans[len]); } return 0; }