Vijos 1308 埃及分数 - 迭代加深
描述
在古埃及,人们使用单位分数的和(形如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
样例输入1
19 45
样例输出1
5 6 18
限制
各个测试点1s
这道题很明显使用搜索
(1)深搜,不知道深度
(2)广搜,保存的数据量可能会过大
(3)迭代加深,剪剪枝时间应该可以过
那就用迭代加深
不过还有一些问题:
(1)从哪开始枚举分母
前面剩下分数的倒数取整和前一个分母+1的最小值
第二个很好理解,至于第一个:
假设前面剩下了a/b,则用[b/a]作分母,新分数可能会比原分数大一点点
所以可以做开始的条件
(2)结束为(最大深度-当前深度+1)*(b/a)取整
Code
/**
*Vijos.org &codevs.cn
*Problem#1308 Problem#1288
*Accepted Accepted
*Time:528ms 741ms
*Memort:564k 256k
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
#define ll long long
#define _max(a,b) (a>b)?(a):(b)
using namespace std;
/**
*定义分数类
*/
typedef bool boolean;
typedef class MyClass{
public:
int s;
int m;
MyClass():s(),m(){}
MyClass(int s,int m):s(s),m(m){}
#undef int
MyClass operator -(MyClass another){
MyClass result;
int g=getCommon(this->m,another.s);
result.m=this->m*another.m/g;
result.s=this->s*another.m/g-this->m/g*another.s;
int g1=getCommon(result.m,result.s);
result.m/=g1;
result.s/=g1;
return result;
}
boolean empty(){
return (m==);
}
boolean operator <(MyClass another){
if(another.empty()) return true;
if(this->empty()) return false;
if(this->s==another.s) return this->m>another.m;
return (this->s*1.0/this->m)<(another.s*1.0/another.m);
}
boolean operator <(double another){
if(this->empty()) return false;
return (this->s*1.0/this->m)<another;
}
inline int getrInt(){
// if(s==0) return -1;
return (int)(this->m/this->s);
}
boolean isWorkable(){
if(this->empty()) return false;
return (m%s==);
}
void operator <<(istream &in){
in>>s>>m;
}
private:
int getCommon(ll a,ll b){
if(b==) return a;
return getCommon(b,a%b);
}
}MyClass;
MyClass maxx;
int results[];
int list[];
int found = ; /**
*迭代加深
*/
void search(int depthLimit,int now,MyClass fs){
if(fs<) return ;
if(now>depthLimit) return ;
if(fs.isWorkable()&&(fs.m>list[now-])&&(found==||maxx<fs)){
maxx=fs;
results[depthLimit]=fs.m/fs.s;
memcpy(results,list,sizeof(int)*depthLimit);
found=depthLimit;
return ;
}
for(int i=_max(fs.getrInt(),list[now-]+);i<=(depthLimit-now+)*fs.getrInt();i++){
list[now]=i;
search(depthLimit,now+,fs-MyClass(,i));
}
}
int main(){
MyClass q;
q<<cin;
// cout<<q.getrInt();
int i=;
list[]=;
while(found==){
search(i,,q);
i++;
}
for(int i=;i<=found;i++){
printf("%d ",results[i]);
}
}
迭代加深
Vijos 1308 埃及分数 - 迭代加深的更多相关文章
- Vijos 1308 埃及分数(迭代加深搜索)
题意: 输入a.b, 求a/b 可以由多少个埃及分数组成. 埃及分数是形如1/a , a是自然数的分数. 如2/3 = 1/2 + 1/6, 但埃及分数中不允许有相同的 ,如不可以2/3 = 1/3 ...
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- codevs 1288 埃及分数 (迭代加深搜索)
题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ...
- 埃及分数问题_迭代加深搜索_C++
一.题目背景 http://codevs.cn/problem/1288/ 给出一个真分数,求用最少的1/a形式的分数表示出这个真分数,在数量相同的情况下保证最小的分数最大,且每个分数不同. 如 19 ...
- vijos1308 埃及分数(迭代加深搜索)
题目链接:点击打开链接 题目描写叙述: 在古埃及.人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不同意2/3=1/3+1/3,由于加数中有同样的.对于 ...
- UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)
UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...
- [Vijos1308]埃及分数(迭代加深搜索 + 剪枝)
传送门 迭代加深搜索是必须的,先枚举加数个数 然后搜索分母 这里有一个强大的剪枝,就是确定分母的范围 #include <cstdio> #include <cstring> ...
- 埃及分数问题(带乐观估计函数的迭代加深搜索算法-IDA*)
#10022. 「一本通 1.3 练习 1」埃及分数 [题目描述] 在古埃及,人们使用单位分数的和(形如 $\dfrac{1}{a}$ 的,$a$ 是自然数)表示一切有理数.如:$\dfrac{ ...
- 埃及分数(codevs 1288)
题目描述 Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一 ...
随机推荐
- 比较两种方式的form请求提交
[一]浏览器form表单提交 表单提交, 适用于浏览器提交.像常见的pc端的网银支付,用户在商户商城购买商品,支付时商家系统把交易数据通过form表单提交到三方支付网关,然后用户在三方网关页面完成支付 ...
- GetLastError()返回值列表
GetLastError()返回值列表: [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无 ...
- 导入转储文件的时候:Error Code: 1406. Data too long for column - MySQL
MySQL will truncate any insert value that exceeds the specified column width. to make this without e ...
- 20165305 苏振龙 《Java 程序设计》第一次测试总结
第一个代码运行结果截图 功能:从1到5305进行求和 第二个代码运行结果截图 代码托管 第三个代码运行结果截图 (1)源文件的名字为Person.java (2)生成2个字节码文件,名字为Person ...
- 20165215 实验一 Java开发环境的熟悉
20165215 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:张家佳 学号:20165215 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...
- android排除报很多错方法 Execution failed for task ':app:compileDebugJavaWithJavac' in Android Studio
android排除报很多错方法1.回撤对应layout的xml改动2.回撤对应java的改动3.重命名文件后导致的资源不对应 Execution failed for task ':app:compi ...
- 2017年3月29日 webService入门理解 二
前边说到了N多webService的概念. 其实,说白了,我个人理解的话,webService就是一个“概念”.就好像互联网一样,就是一个很虚幻,很高的一个概念.同样,webService也是.互联网 ...
- jQuery的ajaxFileUpload上传插件——刷新一次才能再次调用触发change
这个问题并不是由change事件失效造成的,而是ajaxFileUpload插件造成的,它会把原来的file元素替换成新的file元素,所以之前绑定的change事件就失效了. 查了一些资料,有些朋友 ...
- vue 组件之间 的通信
组件之间通信: 同级组件之间通信:两个组件定义应用到同一个vue实例之下: <div id="webapp" class="box"> & ...
- react复习总结(2)--react生命周期和组件通信
这是react项目复习总结第二讲, 第一讲:https://www.cnblogs.com/wuhairui/p/10367620.html 首先我们来学习下react的生命周期(钩子)函数. 什么是 ...