uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version)


题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define LL long long
#define N 10
using namespace std; LL dep,flag,pre[N],now[N];
bool book[]; // 函数功能:求最大公约数
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} // 函数功能:遍历第dep步的所有解
void dfs(LL a,LL b,LL k)
{
if(b%a==&&b/a>now[k-]&&(b/a>||!book[b/a])) // 找到符合要求的结果
{ /* 不要忘记判断最后的结果是否能使用,不然会WA,且要记得b/a的范围在1000以内才能判断,不然会数组越界 */
/* 不能把book放下面判断,没有循环continue不能用,return会出错,可能没有到达dep步b%a==0,但是b/a是不能使用的 */
now[k]=b/a;
bool ans=;
for(int i=k;i>=;i--)
{
if(now[i]<pre[i])
{
ans=;
break;
}
else if(now[i]>pre[i])
break;
}
if(!flag||ans)
memcpy(pre,now,sizeof(now));
flag=;
return ;
}
LL s=b/a;
if(s<=now[k-]) s=now[k-]+;
LL t=(dep-k+)*b/a; // 迭代搜索执行到第dep步就结束了,限制上界
/* 之所以是这个公式是,s是使等式成立最接近的解,把s平均拆分成dep-k+1份,如果没t还小,剩下的dep-k步无论取多少都会偏小 */
if(flag&&t>pre[dep]) t=pre[dep]-;
for(LL i=s;i<=t;i++)
{
if(i<=&&book[i]) // 判断这个点能否使用,不要忘记范围,不要越界访问
continue;
now[k]=i;
LL m=gcd(a*i-b,b*i);
dfs((a*i-b)/m,(b*i)/m,k+);
}
return;
} // 函数作用:简洁。可去掉,放在main函数中
inline void slove(LL a,LL b)
{
now[]=;
for(dep=;dep<=N;dep++)
{
dfs(a,b,);
if(flag)
{
printf("1/%lld",pre[]);
for(LL i=;i<=dep;i++)
printf("+1/%lld",pre[i]);
printf("\n");
return;
}
}
} int main()
{
int T,cnt=;
scanf("%d",&T);
while(T--)
{
flag=;memset(book,false,sizeof(book));
LL a,b,k,x;
scanf("%lld %lld %lld",&a,&b,&k);
while(k--)
{
scanf("%lld",&x);
book[x]=true;
}
printf("Case %d: %lld/%lld=",cnt++,a,b);
slove(a,b);
}
}
uva12558 Egyptian Fractions (HARD version)(迭代深搜)的更多相关文章
- UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)
UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...
- UVA12558 Egyptian Fractions (HARD version)(埃及分数)
传送门 题目大意 给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b (埃及分数意思是分子为1的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ...
- 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)
IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...
- 小结:A* & IDA* & 迭代深搜
概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...
- bzoj 1085骑士精神 迭代深搜
题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...
- [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...
- [codevs1049]棋盘染色<迭代深搜>
题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...
- [noip模拟]小猫爬山<迭代深搜>
[题目描述]: Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Freda和rai ...
随机推荐
- C#基础学习5
数组集合
- VUE学习——vue的内部指令学习(趁自己没忘,学习记录一下)
1.v-if&v-else&v-show v-if用来判断是否加载html的DOM,v-if和v-else一般是一起用的. v-show相当于display,DOM已经加载出来了,这个 ...
- ES6学习笔记(4)----正则的扩展
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 正则的扩展 ES6新增的正则表达式修饰符 u修饰符a.能够更准确地匹配unicode大于\uFF ...
- RxJava尝试取代Handler初探
在之前的一篇文章中,我们探究了RxJava的使用方法,详细请看https://www.cnblogs.com/yanyojun/p/9745675.html 根据扔物线大神的描述,如果用一个词来概括R ...
- DROP CONVERSION - 删除一个用户定义的编码转换
SYNOPSIS DROP CONVERSION name [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP CONVERSION 删除一个以前定义的编码转换. 要 ...
- 二叉排序树BST
注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:
- Mathematics-基础:斐波那契数列
f(1)=1 f(2)=1 f(n)=f(n-1)+f(n-2) n>2
- 搜索 || BFS || POJ 3278 Catch That Cow
农夫在x位置,下一秒可以到x-1, x+1, 2x,问最少多少步可以到k *解法:最少步数bfs 要注意的细节蛮多的,写在注释里了 #include <iostream> #include ...
- MyBatis基本运行环境
MyBatis基本运行环境 1. 创建项目 2.拷贝jar加入到项目中build path jar包 3.创建数据库的表及数据添加 USE [mybatis] CREATE TABLE [dbo].[ ...
- OpenCV2:第五章 访问图像
一.行/列访问 1.单行/单列访问 Mat Mat::row(int i) const Mat Mat::col(int j) const 2.多行/多列访问 Range(start,end); Ra ...