讨论 / 坑逼rqnoj样例格式错误
Hozumi·无名 2017-11-02 05:41:22
点我顶贴 收藏 删除
少空格

附借鉴的代码

http://www.cnblogs.com/zbtrs/p/5766051.html

#include <bits/stdc++.h>

using namespace std;

const int maxn = 25;

int a[maxn], num[maxn];

int n, t, ans;

int chupai()

{

memset(num, 0, sizeof(num));

for (int i = 0; i <= 13; i++)

num[a[i]]++;

int tot = 0;

while (num[4] && num[2] > 1)// 4+2对子

{

num[4]--;

num[2] -= 2;

tot++;

}

while (num[4] && num[1] > 1)//4+2单

{

num[4]--;

num[1] -= 2;

tot++;

}

while (num[4] && num[2])//4+1对子

{

num[4]--;

num[2]--;

tot++;

}

while (num[3] && num[2])//3+1对子

{

num[3]--;

num[2]--;

tot++;

}

while (num[3] && num[1])//3+1单

{

num[3]--;

num[1]--;

tot++;

}

return tot + num[1] + num[2] + num[3] + num[4];//不计顺的最少出牌数

}

void dfs(int step)

{

if (step >= ans) //剪枝

return;

int temp = chupai(); //初始值

if (temp + step < ans)

ans = temp + step; //更新

for (int i = 2; i <= 13; i++)

{

int j = i;

while (a[j] >= 3) // 三顺子

j++;

if (j - i >= 2)

{

for (int j2 = i + 1; j2 <= j - 1; j2++)

{

for (int k = i; k <= j2; k++)

a[k] -= 3;

dfs(step + 1);

for (int k = i; k <= j2; k++)

a[k] += 3;

}

}

}

for (int i = 2; i <= 13; i++)

{

int j = i;

while (a[j] >= 2) //二顺子

j++;

if (j - i >= 3)

{

for (int j2 = i + 2; j2 <= j - 1; j2++)

{

for (int k = i; k <= j2; k++)

a[k] -= 2;

dfs(step + 1);

for (int k = i; k <= j2; k++)

a[k] += 2;

}

}

}

for (int i = 2; i <= 13; i++)

{

int j = i;

while (a[j] >= 1) //五单牌顺子

j++;

if (j - i >= 5)

{

for (int j2 = i + 4; j2 <= j - 1; j2++)

{

for (int k = i; k <= j2; k++)

a[k]--;

dfs(step + 1);

for (int k = i; k <= j2; k++)

a[k]++;

}

}

}

}

int main()

{

cin>>t>>n;

while (t--)

{

memset(a, 0, sizeof(a));

for (int i = 1; i <= n; i++)

{

int x, y;

cin>>x>>y;

if (x == 1) //转换A

x = 13;

else

if (x)

x--;

a[x]++;

}

ans = 24;

dfs(0);

cout<<ans;

}

return 0;

}

#1 renqing@2017-11-02 20:36:28
回复 删除
感谢您的反馈,样例输入输出已经修正
查看更多回复
提交回复