您的位置:首页 > 其它

NOIP2015 斗地主 洛谷P2668

2017-06-04 20:52 405 查看
题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索