题目链接:点击打开链接

题目描写叙述:

在古埃及。人们使用单位分数的和(形如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),编程计算最好的表达方式。

输入:a b

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

解题思路:迭代加深搜索,从1開始枚举深度就可以

注意思想:精度问题,通过约分来控制就可以gcd。同一时候防止溢出long long

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 10000
typedef long long LL;
using namespace std; int maxd;
LL ans[MAXN];
LL v[MAXN];
LL gcd(LL a,LL b){
return b==0?a:gcd(b,a%b);
}
int get_first(int a,int b){
if(b%a==0) return b/a;
else return (b/a+1);
}
bool better(int d){
// for(int i=d;i>=0;--i)if(v[i]!=ans[i]){
// return ans[i]==-1||v[i]<ans[i];
// }
return ans[d]==-1||v[d]<ans[d];
// return false;
}
bool dfs(int d,int from,LL aa,LL bb){
if(d==maxd){
if(bb%aa) return false;
v[d]=bb/aa;
if(better(d)) memcpy(ans,v,sizeof(LL)*(d+1));///赋值时注意LL类型
return true;
}
bool ok=false;
from=max(from,get_first(aa,bb));
for(int i=from;;i++){
if(bb*(maxd+1-d)<=i*aa) break;///防止溢出
v[d]=i;
LL b2=bb*i;
LL a2=aa*i-bb;
LL g=gcd(a2,b2);
if(dfs(d+1,i+1,a2/g,b2/g)) ok=true;
}
return ok;
}
int main(){
int a,b;
while(scanf("%d%d",&a,&b)==2){
for(maxd=1;;maxd++){///ID
memset(ans,-1,sizeof(ans));
if(dfs(1,get_first(a,b),a,b)) break;
}
for(int i=1;ans[i]!=-1;i++)
// if(ans[i]>0)
printf("%lld ",ans[i]);
printf("\n");
}
return 0;
}

vijos1308 埃及分数(迭代加深搜索)的更多相关文章

  1. 埃及分数 迭代加深搜索 IDA*

    迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...

  2. codevs 1288 埃及分数 (迭代加深搜索)

    题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ...

  3. Vijos 1308 埃及分数 - 迭代加深

    描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b,表示方法有很多种, ...

  4. [Vijos1308]埃及分数(迭代加深搜索 + 剪枝)

    传送门 迭代加深搜索是必须的,先枚举加数个数 然后搜索分母 这里有一个强大的剪枝,就是确定分母的范围 #include <cstdio> #include <cstring> ...

  5. 埃及分数问题_迭代加深搜索_C++

    一.题目背景 http://codevs.cn/problem/1288/ 给出一个真分数,求用最少的1/a形式的分数表示出这个真分数,在数量相同的情况下保证最小的分数最大,且每个分数不同. 如 19 ...

  6. UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)

    UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...

  7. POJ1129Channel Allocation[迭代加深搜索 四色定理]

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14601   Accepted: 74 ...

  8. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  9. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

随机推荐

  1. Python语言程序设计之三--列表List常见操作和错误总结

    最近在学习列表,在这里卡住了很久,主要是课后习题太多,而且难度也不小.像我看的这本<Python语言程序设计>--梁勇著,列表和多维列表两章课后习题就有93道之多.我的天!但是题目出的非常 ...

  2. Oracle中创建触发器示例及注意事项

    1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...

  3. tabel使用总结

    对日常使用到的tabel做下记录: <table cellspacing="0"><!--单元格间距为零 默认为2 border默认为 0--> <t ...

  4. python基础-面向对象(装饰器)

    属性:   @property   @method_name.setter   @method_name.deleter   三个标签都是放在方法的上面来使用,且方法名要和后续使用的   变量名字相一 ...

  5. selenium常见控件操作

    下拉选择框 第一种方法:from selenium.webdriver.support.select import Select# 实例化一个Select类的对象 selector = Select( ...

  6. [adb 命令学习篇] adb 命令总结

    https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...

  7. hdu2087

    #include <stdio.h> #include <string.h> int main(){ int cnt,i,j,k; +],tmp[+]; int strl,tm ...

  8. iOS学习笔记08-Quartz2D绘图

    一.Quartz2D简单介绍 在iOS中常用的绘图框架就是Quartz2D,Quartz2D是Core Graphics框架的一部分,我们日常开发使用的所有UIKit组件都是由Core Graphic ...

  9. 【Luogu】P3455Zip-Queries(莫比乌斯反演)

    题目链接 真是神TM莫比乌斯 首先来看一个神奇的结论:求gcd(x,y)==k的对数,其中1<=x<=n,1<=y<=m 等同于求gcd(x,y)==1的对数,其中1<= ...

  10. 洛谷3830 [SHOI2012]随机树 【概率dp】

    题目 输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结 ...