85分求条,玄关
查看原帖
85分求条,玄关
1192554
ryderyang楼主2025/6/21 18:26

老师的满分代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
vector<int>tmp,ans;//存放分母值
ll gcd(ll a,ll b)//最大公约数
{
	return b==0?a:gcd(b,a%b);
}
// a/b表示当前的分数,depth表示当前深度,start表示下一个加数的分母的起始值,maxb表示分母的最大值,maxdepth表示最大深度
void dfs(ll a,ll b,int depth,ll start,int maxb,int maxdepth)
{
	if(depth>maxdepth) return;//剪枝,如果当前深度大于最大深度,那么就不用继续搜索了
	ll d=gcd(a,b);
	a/=d,b/=d;//将a和b约分
	if(b>maxb) return;//剪枝,如果b大于最大分母,那么就不用继续搜索了
	if(a==1&&b>tmp.back())//最后一个加数的分母必须是最大的
	{
		tmp.push_back(b);
		if(ans.size()==0 || (tmp.size()==ans.size() && tmp.back()<ans.back())) ans=tmp;
		tmp.pop_back();
		return;
	}
	start=max(start,b/a+1);//剪枝,从b/a+1开始搜索,这样就可以避免重复搜索
	for(int i=start;;i++)//枚举下一个加数的分母
	{
		if(b*(maxdepth-depth+1)<a*i) break;//剪枝,如果当前深度到最大深度的剩余搜索空间都不够,那么就不用继续搜索了
		if(i>maxb) break;//剪枝,如果当前分母大于最大分母,那么就不用继续搜索了
		tmp.push_back(i);
		dfs(a*i-b,b*i,depth+1,i+1,maxb,maxdepth);
		tmp.pop_back();
	}
}
int main()
{
	cin>>a>>b;
	for(int maxdepth=1;maxdepth<=10;maxdepth++)//迭代加深最大深度 2^10=1024满足最大值1000
	{
		for(int maxb=1000;maxb<=1e7;maxb*=10)//迭代加深分母的最大值
		{
			dfs(a,b,1,1,maxb,maxdepth);
			if(ans.size())break;//如果找到解,那么就不用继续增加最大分母
		}
		if(ans.size()) break;//如果找到解,那么就不用继续增加最大深度
	}
	for(auto v:ans) cout<<v<<" ";
	return 0;
}

同学的85分代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
vector<int>tmp,ans;
ll gcd(ll a,ll b)
{
	return b==0?a:gcd(b,a%b);
}
void dfs(ll a,ll b,int dp,ll start,int maxb,int maxdp)
{
	if(dp>maxdp)return;
	ll d=gcd(a,b);
	a/=d,b/=d;
	if(b>maxb) return;
	if(a==1 && b>tmp.back())
	{
		tmp.push_back(b);
		if(ans.size()==0 || (tmp.size()==ans.size() && tmp.back()<ans.back())) ans=tmp;
		tmp.pop_back();
		return;
	}
	start=max(start,b/a+1);
	for(int i=start;;i++)
	{
		if(b*(maxdp-dp+1)<a*i)break;
		if(i>maxb)break;
		tmp.push_back(i);
		dfs(a*i-b,b*i,dp+1,i+1,maxb,maxdp);
		tmp.pop_back();
	}
}
int main()
{
	cin>>a>>b;
	for(int maxdp=1;maxdp<=10;maxdp++)
	{
		for(int maxb=1000;maxb<=1e7;maxb*=10)
		{
			dfs(a,b,1,1,maxb,maxdp);
			if(ans.size())break;
		}
		if(ans.size())break;
	}
	for(auto v:ans) cout<<v<<" ";
	return 0;
}
2025/6/21 18:26
加载中...