UVa 12558 - Egyptian Fractions (HARD version)
题目大意:
给出一个真分数,把它分解成最少的埃及分数的和。同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大。
分析:
迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了。具体可以参考一下紫书。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long LL;
LL ans[],v[];
set<LL> s;
int maxd;
LL gcd(LL a,LL b)
{
return b?gcd(b,a%b):a;
}
typedef long long LL;
LL get_first(LL a,LL b)
{
return b/a+;
}
bool better(int d)
{
for(int i=d;i>=;i--)
if(v[i]!=ans[i])
return ans[i]==-||v[i]<ans[i];
return false;
}
bool dfs(int d,LL from,LL aa,LL bb)
{
if(d==maxd)
{
if(bb%aa) return false;
v[d]=bb/aa;
if(s.count(bb/aa)) return false; if(better(d)) memcpy(ans,v,sizeof(LL)*(d+));
return true;
}
bool ok=false;
for(LL i=max(from,get_first(aa,bb));;i++)
{
if(bb*(maxd+-d)<=i*aa)
break;
if(s.count(i)) continue;
v[d]=i;
LL b2=bb*i;
LL a2=aa*i-bb;
LL g=gcd(a2,b2);
if(dfs(d+,i+,a2/g,b2/g))
ok=true;
}
return ok;
}
int main()
{
int t,k;
LL a,b,num;
scanf("%d",&t);
for(int ii=;ii<=t;ii++)
{
s.clear();
scanf("%lld%lld%d",&a,&b,&k);
for(int i=;i<k;i++)
{
scanf("%lld",&num);
s.insert(num);
}
int ok=;
for(maxd=;;maxd++)
{
memset(ans,-,sizeof(ans));
if(dfs(,get_first(a,b),a,b))
{
ok=;break;
} }
printf("Case %d: %lld/%lld=",ii,a,b);
for(int i=;i<=maxd;++i){
if(i) printf("+");
printf("1/%lld",ans[i]);
}
printf("\n");
}
return ;
}
UVa 12558 - Egyptian Fractions (HARD version)的更多相关文章
- UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)
UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...
- uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...
- 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)
IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...
- UVA12558 Egyptian Fractions (HARD version)(埃及分数)
传送门 题目大意 给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b (埃及分数意思是分子为1的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ...
- 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...
- UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)
Problem UVA12558-Efyptian Fractions(HARD version) Accept:187 Submit:3183 Time Limit: 3000 mSec Pro ...
- UVa 10814 - Simplifying Fractions
题目大意:给一个分数,对其进行化简.因为分子.分母最大为1030,所以用要用大数. import java.io.*; import java.util.*; import java.math.*; ...
- 【例题 7-3 UVA - 10976】Fractions Again?!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] x>=y => \(\frac{1}{x}<=\frac{1}{y}\) => \(\frac{1}{x}= ...
随机推荐
- spring mvc重定向页面
@RequestMapping(value="/del/{id}") public String delUser(@PathVariable int id){ return &qu ...
- C#伪静态实现的方法
在asp.net开发网站的时候,我们经常会用到伪静态,好处是可以隐藏真实的路径,提高网站的安全性,在官网等展示网站希望对搜索引擎友好,提高搜索排名:或者在涉及到模板开发都会用到伪静态.下面讲解下平时用 ...
- u-boot 之配置分析 (2)
Makefile简要分析所有这些目录的编译连接都是由顶层目录的makefile来确定的. 1.在makefile中有: unconfig: @rm -f $(obj)include/config.h ...
- mysql.default_socket 和 mysqli.default_socket
php.ini 里面mysql.default_socket 和 mysqli.default_socket 设置必须要和mysql里面的值一样,否则连接mysql会提示错误
- async = require('async')
var mongoose = require('mongoose'), async = require('async'); mongoose.connect('localhost', 'learn-m ...
- WP8 学习 在APP.XAML中加入Resources
<Application.Resources> <local:LocalizedStrings xmlns:local="clr-namespace:test1" ...
- javaweb之Cookie篇
Cookie是在浏览器访问某个Web资源时,由Web服务器在Http响应消息头中通过Set-Cookie字段发送给浏览器的一组数据. 一个Cookie只能表示一个信息对,这个信息对有一个信息名(Nam ...
- 最新的goldengate monitor 12.1.3已经发布
Oracle GoldenGate管理包针对OGG提供企业级的监控和管理,包含有如下模块: Oracle Enterprise Manager Plug-in. 利用OEM框架查看.管理和预警OGG ...
- MySQL表的增删改查和列的修改(二)
一.使用Like模糊查找搜索前缀为以“exam_”开头的表名 show tables like 'exam_%' ; 语句结束符号是:也是用\G来表示 二.MySQL表的CRUD 2.1 创建表: C ...
- HDU 1045 - Fire Net (最大独立集)
题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝 ...