迭代加深搜索 求调
查看原帖
迭代加深搜索 求调
508589
ginkgo_tree楼主2022/11/24 19:11

求大佬帮忙看看 个人感觉思路没问题 找不到错哪了

TLE了七个点

#include<bits/stdc++.h>
#define ll long long

using namespace std;

ll dep, st[1000], ans[1000], flag;

ll _gcd(ll x, ll y){
	return y == 0 ? x : _gcd(y, x % y);
}

void dfs(ll a, ll b, int x){
	if(x > dep) return;
	if(a == 1 && b > st[x - 1]){
		st[x] = b;
		if(!flag || st[x] < ans[x]){// 个数小优先(如果少一位 那么 ans[x] 必定小于 st[x] (ans[x] 会是0))个数相同分母小 分数大的优先 
			for(int i = 1; i <= dep; i++){
				ans[i] = st[i];
			}
		}
		flag = 1;
		return;
	}
	ll l = max((ll)ceil(b / a), st[x - 1] + 1);//下限(分母最小值) 比上一层大1 或 当前剩余的分数 a/b 的分母除以分子 上取整 (可以保证1/k <= a/b) 
	ll r = (dep - x + 1) * ceil(b / a);//上限(分母最大值) 接下来的分数要大于等于 (a/b) / (dep - x + 1) 所以分母小于等于 (dep - x + 1) * b / a
	if(flag && r >= ans[dep]){
		r = ans[dep] - 1; //保证最优性 有解了 上限是小于上一个解 
	}
	for(ll i = 1; i < r; i++){
		st[x] = i;
		ll g = _gcd(a * i - b, b * i);// a/b  - 1/i 通分 即为 (a * i - b) / (b * i) 剩余分数 
		dfs((a * i - b) / g, b * i / g, x + 1);
	}
}

int main(){
	ll a, b;
	scanf("%lld%lld", &a, &b);
	ll c = _gcd(a, b);
	a /= c, b /= c;
	st[0] = 1;
	for(dep = 1; dep <= 10; dep++){
	//	ans[dep] = 0x3f3f3f3f; 
		dfs(a, b, 1);
		if(flag){//第一组解就是最优解 因为深度小的优于深度大的 在搜索时分母最小的最优性也得以保证 
			for(int i = 1; i <= dep; i++){
				printf("%lld ", ans[i]);
			}
			break;
		}
	}
	return 0;
}
2022/11/24 19:11
加载中...