记录编号 |
321401 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2015]斗地主 |
最终得分 |
100 |
用户昵称 |
哒哒哒哒哒! |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.008 s |
提交时间 |
2016-10-13 18:47:43 |
内存使用 |
0.30 MiB |
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*f;
}
int n,card[20],b[5],ans;
int search(int a[]){
memset(b,0,sizeof(b));
for(int i=3;i<=16;i++) b[a[i]]++;
int s=0;
while(b[4] && b[2]>=2) s++,b[4]--,b[2]-=2;
while(b[4] && b[1]>=2) s++,b[4]--,b[1]-=2;
while(b[3] && b[2]>=1) s++,b[3]--,b[2]--;
while(b[3] && b[1]>=1) s++,b[3]--,b[1]--;
return s+b[1]+b[2]+b[3]+b[4];
}
void dfs(int cnt,int a[]){
if(cnt>ans) return;
ans=min(ans,cnt+search(a));
for(int i=3,j;i<=13;i++){
for(j=i;a[j]>=3&&j<=14;j++);
if(j-i<2)continue;
for(int k=j;k-i>=2;k--){
for(int l=i;l<k;l++)a[l]-=3;
dfs(cnt+1,a);
for(int l=i;l<k;l++)a[l]+=3;
}
}
for(int i=3,j;i<=12;i++){
for(j=i;a[j]>=2&&j<=14;j++);
if(j-i<3)continue;
for(int k=j;k-i>=3;k--){
for(int l=i;l<k;l++)a[l]-=2;
dfs(cnt+1,a);
for(int l=i;l<k;l++)a[l]+=2;
}
}
for(int i=3,j;i<=10;i++){
for(j=i;a[j]>=1&&j<=14;j++);
if(j-i<5)continue;
for(int k=j;k-i>=5;k--){
for(int l=i;l<k;l++)a[l]--;
dfs(cnt+1,a);
for(int l=i;l<k;l++)a[l]++;
}
}
}
int main(){
freopen("landlords.in","r",stdin);freopen("landlords.out","w",stdout);
int t=read();n=read();
while(t--){
memset(card,0,sizeof card);
for(int i=1;i<=n;i++){
int x=read(),y=read();
if(x==0) x=16;
else if(x<3) x+=13;
card[x]++;
}
ans=search(card);dfs(0,card);
printf("%d\n",ans);
}
getchar();getchar();
fclose(stdin);fclose(stdout);
return 0;
}