斗地主
98分 无能为力了
是个搜索,先开始没动脑筋,直接每种情况都搜,样例都要跑5秒钟,然后看了看题解,看到了一句话:后面可以贪心。
好像是的,那么就贪心吧(因为剩下的东西无非就是几带几,带的越多越好,当然可以贪心了)
然后一直五十几分,下了个数据,发现要逐位枚举顺子,(7 8 9 10 j q)
可以有 7 8 9 10 j ,8 9 10 j q,都要枚举,然后就98分。
原来还能4带4 4可以拆成两个2.。。。。。。。
先开始搜索,就是把所有的顺子搜完,没有先后顺序
次数不会大于15,因为一共只有15种牌
#include<iostream> #include<vector> #include<stdio.h> #include<string.h> using namespace std; int ans=20; int num[30]; inline int max(int x,int y) { return x>y?x:y; } inline int min(int x,int y) { return x<y?x:y; } void dfs(int d) { for(int i=3;i<=10;i++)//单顺子 { if(num[i]>=1) { int pos=0; for(int j=i+1;j<=14;j++) if(num[j]>=1) { if(j-i>=4) { for(int k=i;k<=j;k++) num[k]--; dfs(d+1); for(int k=i;k<=j;k++) num[k]++; } } else break; } } for(int i=3;i<=12;i++)//双顺子 { if(num[i]>=2) { int pos=0; for(int j=i+1;j<=14;j++) if(num[j]>=2) { if(j-i>=2) { for(int k=i;k<=j;k++) num[k]-=2; dfs(d+1); for(int k=i;k<=j;k++) num[k]+=2; } } else break; } } for(int i=3;i<=13;i++)//三顺子 { if(num[i]>=3) { int pos=0; for(int j=i+1;j<=14;j++) if(num[j]>=3) { if(j-i>=1) { for(int k=i;k<=j;k++) num[k]-=3; dfs(d+1); for(int k=i;k<=j;k++) num[k]+=3; } } else break; } } int temp=d; int all[8]; memset(all,0,sizeof(all)); for(int i=2;i<=14;i++) all[num[i]]++; if(num[15]==1) all[5]=1; if(num[16]==1) all[6]=1; for(int i=1;i<=all[4];i++) { if(all[2]>=2) all[2]-=2; else if(all[1]>=2) all[1]-=2; else if(all[2]==1) all[2]--; else if(all[5]>=1&&all[6]>=1) { all[5]--; all[6]--; } else if(i<all[4]) all[4]--; temp++; } for(int i=1;i<=all[3];i++) { if(all[2]>=1) all[2]--; else { if(all[1]>=1) all[1]--; else { if(all[5]>=1) all[5]--; else if(all[6]>=1) all[6]--; } } temp++; } temp+=(all[2]+all[1]+max(all[5],all[6])); ans=min(ans,temp); } int main() { // freopen("output1.txt","w",stdout); int T,n; scanf("%d%d",&T,&n); while(T--) { // cout<<T<<"--------"<<endl; ans=20; memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); if(a!=0&&a!=1) num[a]++; if(a==1) num[14]++; if(a==0) { if(b==1) num[15]++; if(b==2) num[16]++; } } /* for(int i=2;i<=16;i++) { if(i==11) { cout<<"J:"<<num[i]<<endl; continue; } if(i==12) { cout<<"Q:"<<num[i]<<endl; continue; } if(i==13) { cout<<"K:"<<num[i]<<endl; continue; } if(i==14) { cout<<"A:"<<num[i]<<endl; continue; } if(i==15) { cout<<"W1:"<<num[i]<<endl; continue; } if(i==16) { cout<<"W2:"<<num[i]<<endl; continue; } cout<<i<<":"<<num[i]<<endl; }*/ dfs(0); cout<<ans<<endl; } // fclose(stdout); return 0; }