NOIP2015 斗地主 洛谷P2668

53 篇文章 1 订阅
39 篇文章 0 订阅

题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 25
int T,n,ans,a[N];
int t[]={13,11,12,0,1,2,3,4,5,6,7,8,9,10};
inline int read(){
    int x=0;char c=getchar();
    //while(c<'0'||c>'9'){ if(c=='-') f=-1;c=getchar(); }
    while(c>'9'||c<'0') c=getchar();
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c-'0');
        c=getchar();
    }
    return x;
}
void DFS(int d){
    if(d>ans) return ;
    int c[5]={0,0,0,0,0};
    for(int i=0;i<=13;i++) if(a[i]==1) c[1]++;//鍗曞紶鐨?
    for(int i=0;i<=13;i++) if(a[i]==2) c[2]++;//瀵瑰瓙
    for(int i=0;i<=13;i++) if(a[i]==3) {
        c[3]++;
        if(c[2]>=1) c[2]--;//涓夊甫瀵?
        else if(c[1]>=1) c[1]--;//涓夊甫涓€
    }
    for(int i=0;i<=13;i++) if(a[i]==4){
        c[4]++;
        if(c[1]>=2) c[1]-=2;//鍥涘甫浜?
        else if(c[2]>=2) c[2]-=2;//鍥涘甫淇╁
        else if(c[2]>=1) c[2]-=1;//杩樻槸鍥涘甫浜?
    }
    ans=min(ans,d+c[1]+c[2]+c[3]+c[4]);
    //椋炴満
    for(int j,i=0;i<=10;i++){
        for(j=i;j<=11;j++){
            a[j]-=3;
            if(a[j]<0) break;
            if(j-i+1 >= 2) DFS(d+1);
        }
        if(j==12) j--;
        while(j>=i) a[j--]+=3;
    }
    //涓夎繛瀵?
    for(int j,i=0;i<=9;i++){
        for(j=i;j<=11;j++){
            a[j]-=2;
            if(a[j]<0) break;
            if(j-i+1 >= 3) DFS(d+1);
        }
        if(j==12) j--;
        while(j>=i) a[j--]+=2;
    }
    //浜旇繛鍗?
    for(int j,i=0;i<=7;i++){
        for(j=i;j<=11;j++){
            a[j]--;
            if(a[j]<0) break;
            if(j-i+1 >= 5) DFS(d+1);
        }
        if(j==12) j--;
        while(j>=i) a[j--]+=1;
    }
}
int main(){
    T=read();
    for(n=read();T--;){
        ans=n;
        memset(a,0,sizeof a );
        for(int i=1,u,v;i<=n;i++){
            u=read();v=read();
            a[t[u]]++;
        }
        DFS(0);
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值