70分求助 wa

P2540 [NOIP2015 提高组] 斗地主 加强版

```cpp #include<iostream> #include<cstdlib> using namespace std; inline int read(){ int re=0; char t=getchar(); while(t>'9'||t<'0')t=getchar(); while(t>='0'&&t<='9')re=(re<<3)+(re<<1)+(t^48),t=getchar(); return re; } int card[20],ans; void clear(){ for(int i=0;i<19;i++)card[i]=0; ans=0; } int sanshunzi(int x){ int cnt=0; for(int i=x;i<=14;i++){ if(card[i]>=3)cnt++; else break; } return cnt>1?cnt:0; } int shuangshunzi(int x){ int cnt=0; for(int i=x;i<=14;i++){ if(card[i]>=2)cnt++; else break; } return cnt>2?cnt:0; } int danshunzi(int x){ int cnt=0; for(int i=x;i<=14;i++){ if(card[i]>=1)cnt++; else break; } return cnt>4?cnt:0; } int sanpai(){ int zha=0,san=0,dui=0,dan=0,king=card[0]; bool four=false,three=false; int re=0; for(int i=3;i<=15;i++){ if(card[i]==1)dan++; else if(card[i]==2)dui++; else if(card[i]==3)san++; else if(card[i]==4)zha++; } for(int i=1;i<=zha;i++){ if(dan>=2)dan-=2,re++; else if(dui>=2)dui-=2,re++; else if(dan==1)dan--,re++; else if(dui==1)dui--,re++; else re++,four=true; } for(int i=1;i<=san;i++){ if(dan>=1)dan--,re++; else if(dui>=1)dui--,re++; else re++,three=true; } re=re+dan+dui; if(four)king=0; else if(three&&king>=1)king--; re+=(king?1:0); return re; } bool check(){ for(int i=0;i<=15;i++){ if(card[i]!=0)return false; }return true; } void dfs(int depth){ if(depth+1>=ans)return; for(int i=3;i<=13;i++){ int ssz=sanshunzi(i); if(ssz==0)continue; for(int sz=2;sz<=ssz;sz++){ for(int j=i;j<=i+sz-1;j++)card[j]-=3; dfs(depth+1); for(int j=i;j<=i+sz-1;j++)card[j]+=3; } } for(int i=3;i<=12;i++){ int ssz=shuangshunzi(i); if(ssz==0)continue; for(int sz=3;sz<=ssz;sz++){ for(int j=i;j<=i+sz-1;j++)card[j]-=2; dfs(depth+1); for(int j=i;j<=i+sz-1;j++)card[j]+=2; } } for(int i=3;i<=10;i++){ int dsz=danshunzi(i); if(dsz==0)continue; for(int sz=5;sz<=dsz;sz++){ for(int j=i;j<=i+sz-1;j++)card[j]--; dfs(depth+1); for(int j=i;j<=i+sz-1;j++)card[j]++; } } int sp=sanpai(); ans=min(ans,depth+sp); return; } int main(){ int T=read(),n=read(); for(int t=1;t<=T;t++){ clear(); for(int i=1;i<=n;i++){ int x=read(),y=read(); if(x==1)x=14; else if(x==2)x=15; card[x]++; } ans=n; dfs(0); cout<<ans<<endl; } } ``` 代码如此
by WannaYellow @ 2022-06-10 21:51:36


|