社区讨论

60分求助QAQ

P2668[NOIP 2015 提高组] 斗地主参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi6xpdia
此快照首次捕获于
2025/11/20 12:31
4 个月前
此快照最后确认于
2025/11/20 12:31
4 个月前
查看原帖
蒟蒻调了一中午QAQ
要哭了嘤嘤嘤
CPP
#include<bits/stdc++.h>
using namespace std;
int t,n,minn=0x7f7f7f7f;
int a[30],num[16];
int king;
void dfs(int dep){
    if(dep>minn) return;
    int cnt=0;
    for(int i=3;i<=14;i++){//three shunzi
        if(num[i]>=3) cnt++;
        else cnt=0;
        if(cnt>=3){
            for(int j=i;j>=i-cnt+1;j--) num[j]-=3;
            dfs(dep+1);
            for(int j=i;j>=i-cnt+1;j--) num[j]+=3;
        }
    }
    cnt=0;
    for(int i=3;i<=14;i++){//double shunzi
        if(num[i]>=2) cnt++;
        else cnt=0; 
        if(cnt>=3){
            for(int j=i;j>=i-cnt+1;j--) num[j]-=2;
            dfs(dep+1);
            for(int j=i;j>=i-cnt+1;j--) num[j]+=2;
        }
    }
    cnt=0;
    for(int i=3;i<=14;i++){//single shunzi
        if(num[i]>=1) cnt++;
        else cnt=0; 
        if(cnt>=5){
            for(int j=i;j>=i-cnt+1;j--) num[j]--;
            dfs(dep+1);
            for(int j=i;j>=i-cnt+1;j--) num[j]++;
        }
    }
    cnt=0;
    int sit;
    for(int i=3;i<=15;i++){//dai card
        if(num[i]==4){//4 card
            num[i]-=4;
            for(int j=3;j<=15;j++){//dai single
                if(j==i) continue;
                if(num[j]==1 && cnt<2){
                    cnt++;
                    num[j]--;
                    if(cnt==2){
                        dfs(dep+1);
                        num[j]++;
                        num[sit]++;
                    }
                    sit=j;
                }
                if(king==2){
                    king=0;
                    dfs(dep+1);
                    king=2;
                }
            }
            sit=0;cnt=0;
            for(int j=3;j<=15;j++){//dai double
                if(j==i) continue;
                if(num[j]>=2 && cnt<2){
                    cnt++;
                    num[j]-=2;
                    if(cnt==2){
                        dfs(dep+1);
                        num[j]+=2;
                        num[sit]+=2;
                    }
                    sit=j;
                }
            }
            sit=0;cnt=0;
            dfs(dep+1);
            num[i]+=4;
        }
        if(num[i]==3){//3 card
            num[i]-=3;
            for(int j=3;j<=15;j++){
                if(j==i) continue;
                if(num[j]==1){//dai single
                    num[j]--;
                    dfs(dep+1);
                    num[j]++;
                }
                if(num[j]>=2){//dai double
                    num[j]-=2;
                    dfs(dep+1);
                    num[j]+=2;
                }
                if(king==1){
                    king--;
                    dfs(dep+1);
                    king++;
                }
                if(king==2){
                    king=0;
                    dfs(dep+1);
                    king=2;
                }
            }
            dfs(dep+1);
            num[i]+=3;
        }
    }
    for(int i=3;i<=15;i++){
        if(num[i]) cnt++;
    }
    if(king==2 || king==1) cnt++;
    minn=min(minn,cnt+dep);
    
    
}
int main(){
	//freopen("test.txt","w",stdout);
    scanf("%d %d",&t,&n);
    int cnm;
    while(t--){
        memset(num,0,sizeof(num));
		minn=0x7f7f7f7f;
		king=0;
        for(int i=1;i<=n;i++){
            scanf("%d %d",&a[i],&cnm);
            if(a[i]==1) a[i]=14;
            if(a[i]==2) a[i]=15;
            if(a[i]==0) king++;
            num[a[i]]++;
            //cout<<a[i]<<endl;
        }
        //for(int i=3;i<=15;i++) cout<<i<<" "<<num[i]<<endl;
        dfs(0);
        cout<<minn<<endl;
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...