集中管理:領導者,不能不考慮的幾件事之—— 拿什麼輔助你,我的決策?(二)...
阿新 • • 發佈:2020-10-14
首先題目規則就是鬥地主的規則,只有大王和小王的規則與平時的鬥地主有一點出入。就是暴搜,既然是暴搜程式碼就肯定是又臭又長。\(de\)了三個小時的\(bug\)發現一個>
寫成了<
,哭了啊。嗚嗚嗚嗚~~~。
#include<bits/stdc++.h> using namespace std; #define scy(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout); inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } int t,n,ans,sum[25]; void dfs (int x){ if(x>=ans) return; //順子 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]--; dfs(x+1); for(int j=i;j>=i-k+1;j--) sum[j]++; } } } 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; } } } 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; } } } for(int i=2;i<=14;i++){//列舉有三張或四張的 if(sum[i]<=3){ if(sum[i]<=2) continue; sum[i]-=3; for(int j=2;j<=15;j++){ if(sum[j]<=0||j==i) continue; sum[j]--; dfs(x+1); sum[j]++; } for(int j=2;j<=14;j++){ if(sum[j]<=1||j==i) continue; sum[j]-=2; dfs(x+1); sum[j]+=2; } sum[i]+=3; } else{ sum[i]-=3; for(int j=2;j<=15;j++){ if(sum[j]<=0||j==i) continue; sum[j]--; dfs(x+1); sum[j]++; } for(int j=2;j<=14;j++){ if(sum[j]<=1||j==i) continue; sum[j]-=2; dfs(x+1); sum[j]+=2; } sum[i]+=3; sum[i]-=4; for(int j=2;j<=15;j++){ if(sum[j]<=0||j==i) continue; sum[j]--; for(int k=2;k<=15;k++){ if(sum[k]<=0||j==k) continue; sum[k]--; dfs(x+1); sum[k]++; } sum[j]++; } 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||j==k) continue; sum[k]-=2; dfs(x+1); sum[k]+=2; } sum[j]+=2; } sum[i]+=4; } } for(int i=2;i<=15;i++) if(sum[i]) x++; ans=min(ans,x); } int main(){ //scy("in"); t=read(),n=read(); while(t--){ ans=0x7fffffff; int x,y; memset(sum,0,sizeof sum); for(int i=1;i<=n;i++){ x=read(),y=read(); if(x==0) sum[15]++; else if(x==1) sum[14]++; else sum[x]++; } dfs(0); printf("%d\n",ans); } }