搜索做法 TLE #2 WA #9 求助
查看原帖
搜索做法 TLE #2 WA #9 求助
776232
zhizhizhiwang楼主2024/10/4 12:50

rt 代码:

#include <iostream>
#include <stdint.h>
#include <algorithm>
#include <cstring>

using namespace std;

int const N = 1e5 + 10;

template <typename T>
void read(T &x)
{
	int f = 1, ch = getchar();
	x = 0;
	while(!isdigit(ch))
	{
		if(ch == '-')f = -f;
		ch = getchar();
	}
	while(isdigit(ch))
	{
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return ;
}

template <typename T, typename... Args>
void read(T &x, Args&... args)
{
	read(x);
	read(args...);
}


int num[45][45];
int n, plu;
bool zero;
string S;
string A;
int l;

bool dfs(int sum, int step, int i,int p)
{
	if(p < 0 or sum > n or sum + num[step + 1][l] < n)
		return false;
	
	if(step == (int)l)
	{
		if(sum == n) 
		{
			printf("%d\n", plu);
			return true;
		}
			return false;
	}
	
	return dfs(sum - num[i][step] + num[i][step + 1], step + 1, i, p) or dfs(sum + num[step + 1][step + 1], step + 1, step + 1, p - 1);
}

int main()
{
	cin >> A;
	for(int i = 0;i < (int)A.size();i++) {
		if(A[i] != '0')
			zero = 1;
		if(zero)
			S += A[i];
	}
	
	read(n);
	l = (int)S.length();
	for(int i = 1;i <= l; i++)
		for(int j = i;j <= l; j++)
		{
			num[i][j] = num[i][j-1] * 10 + S[j - 1] - '0';
			
			if (num[i][j] > n)
			{
				while (j <= l) num[i][j++] = 2 * n;
			}
		}	
	for(plu = 0;plu < l;plu++)
		if(dfs(num[1][1], 1, 1, plu))
			return 0;
	
	
	printf("-1");
	return 0;
	
	
	
}

2024/10/4 12:50
加载中...