P2540 [NOIP2015 提高组] 斗地主 加强版
why sum[16] 就不行

//~~~ j>=j-k+1 //~~~ sum[i]=0 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1e1; int sum[200],n,ans=0x3f3f3f3f; void dfs(int x) { if(x>=ans) return; //dan_shunzi int k=0; for(int i=3;i<=14;i++){ if(sum[i]<=0) k=0; else{ k++; if(k>=5){ for(int j=i;j>=i-k+1;j--) sum[j]-=1;//!!!!!!!!! dfs(x+1); for(int j=i;j>=i-k+1;j--) sum[j]+=1; } } } //shuang_shunzi k=0; for(int i=3;i<=14;i++){ if(sum[i]<=1) k=0; else{ k++; if(k>=3){ for(int j=i;j>=i-k+1;j--) sum[j]-=2; dfs(x+1); for(int j=i;j>=i-k+1;j--) sum[j]+=2; } } } //sanshunzi k=0; for(int i=3;i<=14;i++){ if(sum[i]<=2) k=0; else{ k++; if(k>=2){ for(int j=i;j>=i-k+1;j--) sum[j]-=3; dfs(x+1); for(int j=i;j>=i-k+1;j--) sum[j]+=3; } } } //dai_pai------>3+_ k=0; for(int i=2;i<=14;i++){ if(sum[i]<=3) { if(sum[i]<=2) continue; sum[i]-=3; //3+1 //-> for(int j=2;j<=15;j++){ if(sum[j]<=0||i==j) continue; sum[j]--; dfs(x+1); sum[j]++; } sum[i]+=3; //3+2 sum[i]-=3; for(int j=2;j<=14;j++){ if(sum[j]<=1||i==j) continue; sum[j]-=2; dfs(x+1); sum[j]+=2; } sum[i]+=3; } else////////////////////////////////////////////king 15 16 { sum[i]-=3; //3+1 //-> for(int j=2;j<=15;j++){ if(sum[j]<=0||i==j) continue; sum[j]--; dfs(x+1); sum[j]++; } sum[i]+=3; //3+2 sum[i]-=3; for(int j=2;j<=14;j++){ if(sum[j]<=1||i==j) continue; sum[j]-=2; dfs(x+1); sum[j]+=2; } sum[i]+=3; //4+1+1 sum[i]-=4; for(int j=2;j<=15;j++){ if(sum[j]<=0||j==i) continue; sum[j]-=1; //-> for(int k=2;k<=15;k++) { //-> if(k==15&&j==15&&sum[15]){ sum[k]-=1; dfs(x+1); sum[k]+=1; } // if(j==15&&k==16||j==16&&k==15) continue; if(sum[k]<=0||k==j||k==i) continue;//+k==i sum[k]-=1; dfs(x+1); sum[k]+=1; } sum[j]+=1; } sum[i]+=4; //4+2+2 sum[i]-=4; for(int j=2;j<=14;j++){ if(sum[j]<=1||j==i) continue; sum[j]-=2; for(int k=2;k<=14;k++) { if(sum[k]<=1||k==j||k==i) continue; sum[k]-=2; dfs(x+1); sum[k]+=2; } sum[j]+=2; } sum[i]+=4; } } // danpai ev tm chu //-> for(int i=2;i<=15;i++) if(sum[i]) x++;//还要回溯 所以不可以 sum[i]=0; 会更改TA的值导致回溯时候 值不对 ans=min(ans,x); } int main() { ios::sync_with_stdio(false); cin.tie(0); int T;cin>>T>>n; while(T--) { ans=0x3f3f3f3f; memset(sum,0,sizeof(sum));//memset // cin>>n; for(int i=1;i<=n;i++){ int x,y;cin>>x>>y; if(x==0) sum[15]++; //else if(x==0&&y==2) sum[16]++; else if(x==1) sum[14]++; else sum[x]++;//////////!!!!!!!!!!!!!!!! } dfs(0); cout<<ans<<'\n'; } return 0; }