博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CODEVS 1288]埃及分数
阅读量:5239 次
发布时间:2019-06-14

本文共 1436 字,大约阅读时间需要 4 分钟。

Description

在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越 好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30, 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18. 最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。 给出a,b(0<a<b<1000),编程计算最好的表达方式。

Input

a b

Output

若干个数,自小到大排列,依次是单位分数的分母。

Sample Input

19 45

Sample Output

5 6 18

题解

迭代的入门经典题...然而我现在才做...

我们将深度迭代,搜索。

由于要使最小的分数最大,所以我们要边搜的时候记录当前状况下的最优解。

加个$A*$。

我们用估价函数算出枚举分母的范围区间。

注意开$int$会爆。

 

1 #include 2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #define LL long long14 #define RE register15 #define IL inline16 using namespace std;17 const LL INF=~0u>>1;18 19 LL keep[100],ans[100];20 LL gcd(LL a,LL b) { return b ? gcd(b,a%b):a;}21 22 LL a,b,lim;23 24 void Dfs(LL cen,LL x,LL y)25 {26 if (cen>lim) return;27 LL g=gcd(x,y);x/=g;y/=g;28 if (x==1&&y>keep[cen-1])29 {30 keep[cen]=y;31 if (keep[cen]
=s) s=keep[cen-1]+1;36 LL t=y*(lim-cen+1)/x;37 for (LL i=s;i<=t;i++)38 {39 keep[cen]=i;40 Dfs(cen+1,i*x-y,y*i);41 }42 }43 44 int main()45 {46 scanf("%lld%lld",&a,&b);47 for (;;lim++)48 {49 ans[lim]=INF;50 Dfs(1,a,b);51 if (ans[1]>0&&ans[1]

 

转载于:https://www.cnblogs.com/NaVi-Awson/p/7373406.html

你可能感兴趣的文章
spring与quartz整合
查看>>
Kattis之旅——Eight Queens
查看>>
3.PHP 教程_PHP 语法
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>
snmpwalk命令常用方法总结
查看>>
网站产品设计
查看>>
代理ARP
查看>>
go 学习笔记(4) ---项目结构
查看>>
java中静态代码块的用法 static用法详解
查看>>
Java线程面试题
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
Java IO流学习总结
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>