noip2015 day1 斗地主

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yalishiyanzhouyu888/article/details/52388256

这道题一看没有什么好的算法,就用搜索、
可以先处理出掉牌多的顺子。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=20;
int a[maxn],ans,cnt[5],n;
inline int read(){
    int sum;
    char c;
    while((c=getchar())<'0' || c>'9');
    sum=c-'0';
    while((c=getchar())>='0' && c<='9')
        sum=sum*10+c-'0';
    return sum;
}
inline int work(int x[]){
    int i;
    memset(cnt,0,sizeof(cnt));
    int sum=0;
    for(i=0;i<=n;i++) cnt[x[i]]++;
    while(cnt[4] && cnt[2]>=2) sum++,cnt[4]--,cnt[2]-=2;
    while(cnt[4] && cnt[1]>=2) sum++,cnt[4]--,cnt[1]-=2;
    while(cnt[3] && cnt[2]>=1) sum++,cnt[3]--,cnt[2]-=1;
    while(cnt[3] && cnt[1]>=1) sum++,cnt[3]--,cnt[1]-=1;
    return sum+cnt[1]+cnt[2]+cnt[3]+cnt[4];
}
inline void dfs(int x[],int step){
    int i,j,k,l;
    if(step>ans) return;
    ans=min(ans,step+work(x));
    for(i=2;i<n;i++){
        for(j=i;x[j]>=3;j++);
        if(j-i>=2) 
            for(k=j;k-i>=2;k--){
                for(l=i;l<k;l++) x[l]-=3;
                dfs(x,step+1);
                for(l=i;l<k;l++) x[l]+=3;
            }
    }   
    for(i=2;i<n;i++){
        for(j=i;x[j]>=2;j++);
        if(j-i>=3)
            for(k=j;k-i>=3;k--){
                for(l=i;l<k;l++) x[l]-=2;
                dfs(x,step+1);
                for(l=i;l<k;l++) x[l]+=2;
            }
    }
    for(i=2;i<n;i++){
        for(j=i;x[j]>=1;j++);
        if(j-i>=5)
            for(k=j;k-i>=5;k--){
                for(l=i;l<k;l++) x[l]--;
                dfs(x,step+1);
                for(l=i;l<k;l++) x[l]++;
            }
    }

}
int main(){
    int i,j,k,m;
    int t;
    t=read();
    k=read();
    n=14;
    int w,c;
    while(t--){
        memset(a,0,sizeof(a));
        for(i=1;i<=k;i++){
            w=read();
            c=read();
            if(w==1) w=13;
            else if(w) w--;
            a[w]++;
        }
        ans=work(a);
        dfs(a,0);
        printf("%d\n",ans);
    }
    return 0;
} 
阅读更多
换一批

没有更多推荐了,返回首页