【CodeVS 1288】埃及分数
http://codevs.cn/problem/1288/
loli秘制面向高一的搜索,好难啊QAQ
我本来想按照分母从大到小搜,因为这样分母从小到大枚举到的第一个可行方案就是最优方案。
但貌似会T。。。
所以按照分母从小往大搜,分母得有个上界。
设分母为\(num\),则\(\frac{step}{num}\geq\frac{a}{b},num \leq \frac{b·step}a\),且\(\frac ab-\frac 1{num}=\frac{a·num-b}{b·num}\)
\(step\)为IDA*枚举的步数。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int step;
ll g, ans[1003], num[1003];
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
void dfs(ll a, ll b, int down, int tmp) {
	if (a < 0) return;
	g = gcd(a, b); a /= g; b /= g;
	if (tmp == step) {
		if (a != 1 || num[tmp - 1] >= b) return;
		num[tmp] = b;
		if (!ans[1] || num[tmp] < ans[tmp])
			memcpy(ans, num, sizeof(ll) * (step + 1));
		num[tmp] = 0;
		return;
	}
	int up = (int) floor(1.0 * b * step / a) + 1;
	for (int i = down; i <= up; ++i) {
		num[tmp] = i;
		dfs(a * i - b, b * i, i + 1, tmp + 1);
	}
	num[tmp] = 0;
}
int main() {
	ll a, b; int up;
	scanf("%lld%lld", &a, &b);
	if (b % a == 0) {
		printf("%lld\n", b / gcd(a, b));
		return 0;
	}
	for (step = 2; ; ++step) {
		up = (int) floor(1.0 * b * step / a);
		for (int i = 2; i <= up; ++i) {
			num[1] = i;
			dfs(a * i - b, b * i, i + 1, 2);
		}
		num[1] = 0;
		if (ans[1]) break;
	}
	for (int i = 1; i <= step; ++i) {
        printf("%lld", ans[i]);
        if (i != step) putchar(' ');
        else putchar('\n');
	}
	return 0;
}
【CodeVS 1288】埃及分数的更多相关文章
- [CODEVS 1288]埃及分数
		Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/ ... 
- codevs 1288 埃及分数 (迭代加深搜索)
		题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ... 
- codevs1288 埃及分数(IDA*)
		1288 埃及分数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在古埃及,人们使用单位分数的和(形如1/a的 ... 
- 埃及分数问题_迭代加深搜索_C++
		一.题目背景 http://codevs.cn/problem/1288/ 给出一个真分数,求用最少的1/a形式的分数表示出这个真分数,在数量相同的情况下保证最小的分数最大,且每个分数不同. 如 19 ... 
- 华为OJ平台——将真分数分解为埃及分数
		题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ... 
- 埃及分数&&The Rotation Game&&骑士精神——IDA*
		IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ... 
- UVA12558 Egyptian Fractions (HARD version)(埃及分数)
		传送门 题目大意 给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b (埃及分数意思是分子为1的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ... 
- Vijos 1308 埃及分数(迭代加深搜索)
		题意: 输入a.b, 求a/b 可以由多少个埃及分数组成. 埃及分数是形如1/a , a是自然数的分数. 如2/3 = 1/2 + 1/6, 但埃及分数中不允许有相同的 ,如不可以2/3 = 1/3 ... 
- JDOJ 1770 埃及分数
		JDOJ 1770: 埃及分数 https://neooj.com/oldoj/problem.php?id=1770 Description 分子均为1的分数叫做埃及分数,因为古代埃及人在进行分数运 ... 
- 一本通例题埃及分数—题解&&深搜的剪枝技巧总结
		一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ... 
随机推荐
- 浅谈Collection集合
			俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ... 
- Windows10应用Docker部署DoNet Core
			Win10和Mac稳定版的Docker发布了,之前看了下徐磊老师的几篇Docker4Dotnet的文章http://devopshub.cn/2016/07/08/docker4dotnet-1-ov ... 
- MyEclipse相关部署问题
			部署Tomcat如果用MyEclipse自动部署方式很有可能出现一个问题: 服务器关联的这个项目却关联到其他的项目上,导致运行时还在运行以前的项目 解决方法: 将状态提示栏的service里的tomc ... 
- AlloyTouch Button插件-不再愁click延迟和点击态
			移动端不能使用click,因为click会有300ms.所有有了fastclick这样的解决方案.然后fastclick并没有解决点击态(用户点击的瞬间要有及时的外观变化反馈)的问题.hover会有不 ... 
- Android 防止控件被重复点击
			转载: 工具类: public class Utils { private static long lastClickTime; public static boolean isFastDoubleC ... 
- Android 手机卫士--导航界面4的业务逻辑
			本文实现导航界面4的业务逻辑,导航界面4的界面如下: 本文地址:http://www.cnblogs.com/wuyudong/p/5952640.html,转载请注明出处. 相应的代码如下: pri ... 
- GDB调试命令小结
			1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ... 
- kvm常用操作
			安装一些虚拟化的组件 yum -y install kvm python-virtinst libvirt bridge-utils virt-manager qemu-kvm-tools virt- ... 
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
			五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ... 
- 微软本月将推Win10 望打破Win8所带来差评影响
			系统妈 据香港“文汇报”7月15日报道,美国电脑巨擘微软13日宣布,新视窗系统10(Windows 10)将于7月29日推出.微软高层迈赫迪在网志表示,届时全球将有13个城市举办特别活动,表扬参与Wi ... 
