社区讨论
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 条回复,欢迎继续交流。
正在加载回复...