UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)
UVA12558 Egyptian Fractions (HARD version)
迭代加深搜索,适用于无上界的搜索。每次在一个限定范围中搜索,如果无解再进一步扩大查找范围。
本题中没有分数个数和分母的上限,只用爆搜绝对TLE。故只能用迭代加深搜索。
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
int num,T,t,k;
ll h[],ans[],a,b,q;
set <ll> del; //存储不能用的数
bool ok;
inline ll gcd(ll A,ll B) {return B ? gcd(B,A%B):A;}
inline bool better(){ //判断最优解
for(int i=num;i>=;--i)
if(h[i]!=ans[i])
return ans[i]==-||h[i]<ans[i];
return ;
}
inline void dfs(ll p1,ll p2,int last,int cnt){//p1/p2:分子/分母 last:这次从哪个分母开始搜 cnt:已经添加了几个子分数
if(cnt==num){
if(p2%p1||del.count(p2/p1)) return ; //分子不为1或者这个数被禁止出现
h[cnt]=p2; ok=;
if(better()) memcpy(ans,h,sizeof(ll)*(cnt+)); //更新最优解
return ;
}
for(ll i= last>p2/p1+ ? last:p2/p1+;;++i) // p2/p1+1:符合条件的最小分母,用于剪枝
{
if(p1*i>=p2*(num-cnt+)) break; //发现最后减不完了,跳出
if(del.count(i)) continue;
ll q1=p1*i-p2,q2=p2*i,G=gcd(q1,q2); //通分
h[cnt]=i;
dfs(q1/G,q2/G,i+,cnt+);
}
}
int main(){
scanf("%d",&T);
for(t=;t<=T;++t){
del.clear(); ok=;
scanf("%lld%lld%d",&a,&b,&k);
for(int i=;i<=k;++i) scanf("%lld",&q),del.insert(q);
for(num=;!ok;++num){ //限定范围
memset(ans,-,sizeof(ans));
dfs(a,b,b/a+,); //b/a+1同上p2/p1+1
}--num; //注意要减掉多出的一次++num操作
printf("Case %d: %lld/%lld=",t,a,b);
for(int i=;i<num;++i) printf("1/%lld+",ans[i]);
printf("1/%lld\n",ans[num]);
}
return ;
}
UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)的更多相关文章
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- codevs 1288 埃及分数 (迭代加深搜索)
题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ...
- UVA12558 Egyptian Fractions (HARD version)(埃及分数)
传送门 题目大意 给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b (埃及分数意思是分子为1的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ...
- uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...
- Vijos 1308 埃及分数 - 迭代加深
描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b,表示方法有很多种, ...
- 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...
- UVa 12558 - Egyptian Fractions (HARD version)
题目大意: 给出一个真分数,把它分解成最少的埃及分数的和.同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大. 分析: 迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了.具体可以 ...
- 埃及分数问题_迭代加深搜索_C++
一.题目背景 http://codevs.cn/problem/1288/ 给出一个真分数,求用最少的1/a形式的分数表示出这个真分数,在数量相同的情况下保证最小的分数最大,且每个分数不同. 如 19 ...
随机推荐
- Linux crontab下关于使用date命令和sudo命令的坑
想要在root 的crontab里面加一些任务计划,希望以www用户运行命令,并且将输出重定向到某处以当时时间命名的日志文件,大致如下 /usr/bin/sudo -u www /usr/local/ ...
- Arrow-一个最好用的日期时间Python处理库
https://www.jianshu.com/p/c878bb1c48c1 写过Python程序的人大都知道,Python日期和时间的处理非常繁琐和麻烦,主要有以下几个问题: 有众多的package ...
- little_rockie
https://www.cnblogs.com/nxld/p/6058591.html
- JS中"属性"的用法
JS的属性和C#有相似之处 ! 使用get和set来进行属性的获取和设置 var obj={ a:"1", get age(){ return obj.a; }, set age ...
- Find a way--hdu2612
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2612 广搜题 注意:可能存在一个@两人都不能达到: 3 3 Y#@ .M# @.. #include ...
- 谷歌技术"三宝"之MapReduce(转)
原文:http://blog.csdn.net/opennaive/article/details/7514146 目录 MapReduce是干啥的 例子统计词频 map函数和reduce函数 M ...
- sql server中的日期详解使用(convert)
转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...
- /etc/issue 查看系统版本号
查看系统版本号 [root@mysql bin]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m
- VUE 使用之:nextTick
<div class="app"> <div ref="msgDiv">{{msg}}</div> <div v-if ...
- PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据
现在数据库里面有一组数据,我们将它按照不同的难度进行分sheet. 首先我们需要写一个mysql的配置文件- db.config.php(utf-8编码) : <?php $dbconfig= ...