首页 > 代码库 > NOIP201507斗地主(C++)
NOIP201507斗地主(C++)
#include<cstdio>
#include<cstring>
using namespace std;
#define N 30
int n,T,ans,a[N],c[N];
int query(){
memset(c,0,sizeof c);
for(int i=0;i<=14;i++) c[a[i]]++;
int tot=0;
while(c[4]&&c[2]>1) c[4]--,c[2]-=2,tot++;
while(c[4]&&c[1]>1) c[4]--,c[1]-=2,tot++;
while(c[4]&&c[2]) c[4]--,c[2]--,tot++;
while(c[3]&&c[2]) c[3]--,c[2]--,tot++;
while(c[3]&&c[1]) c[3]--,c[1]--,tot++;
return tot+c[1]+c[2]+c[3]+c[4];
}
void dfs(int now){
if(now>=ans) return ;
int tmp=query();
if(now+tmp<ans) ans=now+tmp;
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=3;j++);
if(j-i>=2){
for(int t=i+1;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=3;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=3;
}
}
}
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=2;j++);
if(j-i>=3){
for(int t=i+2;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=2;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=2;
}
}
}
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=1;j++);
if(j-i>=5){
for(int t=i+4;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=1;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=1;
}
}
}
}
int main(){
scanf("%d%d",&T,&n);
while(T--){
memset(a,0,sizeof a);ans=1e9;
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
if(x==1) x=14;
a[x]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
NOIP201507斗地主(C++)