1 条题解
-
0赵青海 (huhe) LV 7 SU @ 2021-10-7 14:46:04
#include<cstdio> #include<cstring> int i,j,k,t,n,ans; int a[20],b; int x,y,z,w; bool tre,twi,onc; void calc(int value, int x, int y, int z, int w) { if (value>ans) return; if (z==0 && w==0) { if (value+x+y<ans) ans=value+x+y; return; } if (w>0) { if (x>=2) calc(value+1,x-2,y,z,w-1); if (y>=2) calc(value+1,x,y-2,z,w-1); if (y>=1) calc(value+1,x,y-1,z,w-1); calc(value+1,x,y,z,w-1); } else if (z>0) { if (x>0) calc(value+1,x-1,y,z-1,w); else if (y>0) calc(value+1,x,y-1,z-1,w); else { if (value+z<ans) ans=value+z; return; } } } void dfs(int step) { if (step>ans) return; if (tre==1) { for (int i=3; i<=13; i++) if (a[i]>=3) { int j; for (j=i+1; j<=14; j++) if (a[j]<3) break; if (j-i>=2) { for (int k=i; k+1<j; k++) for (int l=k+1; l<j; l++) { for (int h=k; h<=l; h++) a[h]-=3; dfs(step+1); for (int h=k; h<=l; h++) a[h]+=3; } } i=j; } } if (twi==1) { for (int i=3; i<=12; i++) if (a[i]>=2) { int j; for (j=i+1; j<=14; j++) if (a[j]<2) break; if (j-i>=3) { for (int k=i; k+2<j; k++) for (int l=k+2; l<j; l++) { for (int h=k; h<=l; h++) a[h]-=2; dfs(step+1); for (int h=k; h<=l; h++) a[h]+=2; } } i=j; } } if (onc==1) { for (int i=3; i<=10; i++) if (a[i]>=1) { int j; for (j=i+1; j<=14; j++) if (a[j]<1) break; if (j-i>=5) { for (int k=i; k+4<j; k++) for (int l=k+4; l<j; l++) { for (int h=k; h<=l; h++) a[h]-=1; dfs(step+1); for (int h=k; h<=l; h++) a[h]+=1; } } i=j; } } if (step>ans) return; x=y=z=w=0; for (int i=0; i<=14; i++) if (a[i]>0) { if (a[i]==1) x++; else if (a[i]==2) y++; else if (a[i]==3) z++; else w++; } calc(step,x,y,z,w); } int main() { scanf("%d%d",&t,&n); for (i=1; i<=t; i++) { memset(a,0,sizeof(a)); ans=20; tre=twi=onc=0; //tre,twi,onc统计是否有3,2,1张的连牌存在 for (j=1; j<=n; j++) { scanf("%d%*d",&b); if (b==1) b=14; a[b]++; } for (j=3; j<=13; j++) if (a[j]>=3){ for (k=j+1; k<=14; k++) if (a[k]<3) break; if (k-j>=2) tre=1; } for (j=3; j<=12; j++) if (a[j]>=2) { for (k=j+1; k<=14; k++) if (a[k]<2) break; if (k-j>=3) twi=1; } for (j=3; j<=10; j++) if (a[j]>=1) { for (k=j+1; k<=14; k++) if (a[k]<1) break; if (k-j>=5) onc=1; } dfs(0); printf("%d\n",ans); } return 0; }
- 1
信息
- ID
- 754
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 24
- 已通过
- 12
- 上传者