求大佬帮忙看看 个人感觉思路没问题 找不到错哪了
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;
}