样例过不了, 但是22pts
查看原帖
样例过不了, 但是22pts
728127
Killua_Zaoldyeck楼主2023/7/12 14:48

找不到哪里错(恼

#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int s = 0, w = 1;char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}
	while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}
	return s * w;
}
int T, n, a[16], ans = 0x3f3f3f;
inline void dfs(int step, int sum)
{
	if(step > ans) return ;
	if(sum > n) return ;
	if(sum == n)
	{
		ans = min(step, ans);
		return ;
	}
	for(int i = 2;i <= 15;i ++)
	{
		if(a[i] >= 4)
		{
			a[i] -= 4;
			for(int j = 2;j <= 15;j ++)
			{
				if(i == j) continue;
				if(a[j] >= 1)
				{
					a[j] -= 1;
					for(int k = 2;k <= 15;k ++)
					{
						if(k == i) continue;
						if(a[k] >= 1)
						{
							a[k] --;
							dfs(step + 1, sum + 6);
							a[k] ++;
						}
					}
					a[j] ++;
				}//四带二 
				if(a[j] >= 2 && j != 15)
				{
					a[j] -= 2;
					for(int k = 2;k <= 14;k ++)
					{
						if(k == i) continue;
						if(a[k] >= 2)
						{
							a[k] -= 2;
							dfs(step + 1, sum + 8);
							a[k] += 2;
						}
					}
					a[j] += 2;//四带二对 
				}
			}
			dfs(step + 1, sum + 4);//炸弹 
			a[i] += 4;
		}
		if(i != 2 && i != 15)
		{
			if(a[i] >= 3)
			{
				a[i] -= 3;
				int x = 0, y = 1;
				for(int j = i + 1;j <= 14;j ++)
				{
					x ++;
					if(a[j] >= 3 && x == y)
					{
						y ++;
						a[j] -= 3;
						dfs(step + 1, sum + 3 + x * 3);
						a[j] += 3;
					}
					if(x != y) break;
				}
				a[i] += 3;//三顺子 
			}
			else if(a[i] >= 2)
			{
				a[i] -= 2;
				int x = 0, y = 1;
				for(int j = i + 1;j <= 14;j ++)
				{
					x ++;
					if(a[j] >= 2 && x == y)
					{
						y ++;
						a[j] -= 2;
						dfs(step + 1, sum + 2 + x * 2);
						a[j] += 2;
					}
					if(x != y) break;
				}
				a[i] += 2;//双顺子 
			}
			else if(a[i])
			{
				a[i] --;
				int x = 0, y = 1;
				for(int j = i + 1;j <= 14;j ++)
				{
					x ++;
					if(a[j] >= 1 && x == y)
					{
						y ++;
						a[j] --;
						dfs(step + 1, sum + 1 + x);
						a[j] ++;
					}
					if(x != y) break;
				}
				a[i] ++;//单顺子 
			}
		}
		if(a[i] >= 3)
		{
			a[i] -= 3;
			for(int j = 2;j <= 14;j ++)
			{
				if(i == j) continue;
				if(a[j] >= 2)
				{
					a[j] -= 2;
					dfs(step + 1, sum + 5);
					a[j] += 2;//三带二 
				}
				if(a[j] >= 1)
				{
					a[j] --;
					dfs(step + 1, sum + 4);
					a[j] ++;//三带一 
				}
			}
			dfs(step + 1, sum + 3);//三张牌 
			a[i] += 3;
		}
		if(a[i] >= 2)
        {
            a[i] -= 2;
            dfs(step + 1, sum + 2);
            a[i] += 2;
        }//对子 
		if(a[i] >= 1)
        {
            a[i] --;
            dfs(step + 1, sum + 1);
            a[i] ++;
        }//单张 
	}
}
int main()
{
	T = read(), n = read();
	while(T --)
	{
		for(int i = 1;i <= n;i ++)
		{
			int x = read(), y = read();
			if(x == 0) a[15] ++;
			else if(x == 1) a[14] ++;
			else a[x] ++;
		}
		dfs(0, 0);
		cout << ans << endl;
		for(int i = 1;i <= 15;i ++) a[i] = 0;
		ans = 0x3f3f3f;
	}
	return 0;
}
2023/7/12 14:48
加载中...