【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)
【链接】  我是链接,点我呀:) 
 【题意】
在这里输入题意
【题解】
迭代加深搜索。
枚举最大量maxdep
在dfs里面传剩余的要凑的分子、分母
以及上一次枚举的值是多少。
然后找到最小的k,满足1/k剪枝就是剩余的全都用这个最大的分数。如果都不行就肯定不行了。
二分找这个k.
不能用的数字就直接跳过就行。
【代码】
/*
  	1.Shoud it use long long ?
  	2.Have you ever test several sample(at least therr) yourself?
  	3.Can you promise that the solution is right? At least,the main ideal
  	4.use the puts("") or putchar() or printf and such things?
  	5.init the used array or any value?
  	6.use error MAX_VALUE?
  	7.use scanf instead of cin/cout?
  	8.whatch out the detail input require
*/
/*
    一定在这里写完思路再敲代码!!!
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3;
bool bo[N+10];
int a,b,k,maxdep;
vector<ll> v,ans;
ll getidx(int a,int b){
    //1/i <= a/b 且 i最小
    //b<=a*i
    ll l= 1,r = 1e8;
    ll temp = -1;
    while (l <= r){
        int m = (l+r)>>1;
        if (1LL*a*m>=b){
            temp = m;
            r = m - 1;
        }else l = m + 1;
    }
    return temp;
}
bool Greater(vector<ll> v,vector <ll> ans){
    if ((int)ans.size()==0) return true;
    for (int i = (int)v.size()-1;i>=0;i--)
        if (v[i]!=ans[i]){
                if (v[i]>ans[i]) return false;else return true;
            }
    return false;
}
bool dfs(int dep,int a,int b,ll last){
    if (dep==maxdep){
        if (a==1 && b>last){
            if (b<=1000 && bo[b]) return false;
            v.push_back(b);
            if (Greater(v,ans)) ans = v;
            v.pop_back();
            return true;
        }
        return false;
    }
    ll idx = getidx(a,b);
    ll ma = max(last+1,idx);
    ll delta = maxdep-dep+1;
    //delta/ma<a/b
    bool ok = false;
    for (ll i = ma; ;i++)
        {
            if (i<=1000 && bo[i]) continue;
            if (delta*b<a*i) break;
            //a/b - 1/i
            v.push_back(i);
            ll fenzi = a*i-b,fenmu = b*i;
            ll temp = __gcd(fenzi,fenmu);
            fenzi/=temp,fenmu/=temp;
            if (dfs(dep+1,fenzi,fenmu,i)) ok = true;
            v.pop_back();
        }
    return ok;
}
int main(){
	#ifdef LOCAL_DEFINE
	    freopen("rush_in.txt", "r", stdin);
	#endif
	ios::sync_with_stdio(0),cin.tie(0);
    int T;
    cin >> T;
    int kase = 0;
    while(T--){
        memset(bo,0,sizeof bo);
        cin >> a >> b >> k;
        while (k--){
            int x;
            cin >> x;
            bo[x] = 1;
        }
        ans.clear();
        v.clear();
        for (maxdep = 1;;maxdep++){
            if (dfs(1,a,b,1)){
                cout <<"Case "<<++kase<<": "<<a<<"/"<<b<<"=1/"<<ans[0];
                for (int i = 1;i <(int) ans.size();i++)
                    cout << "+1/"<<ans[i];
                break;
            }
        }
        cout << endl;
    }
	return 0;
}
												
											【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)的更多相关文章
- UVa 12558 - Egyptian Fractions (HARD version)
		
题目大意: 给出一个真分数,把它分解成最少的埃及分数的和.同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大. 分析: 迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了.具体可以 ...
 - 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的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ...
 - 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}= ...
 
随机推荐
- Consolas 字体
			
Consolas是一套等宽字体的字型,属无衬线字体,由Lucas de Groot设计. 概述 这套字型使用了微软的ClearType 字型平滑技术,并随同Windows Vista.Office 2 ...
 - 插入css样式表的三种方法
			
http://www.w3school.com.cn/css/css_howto.asp http://www.runoob.com/css/css-howto.html 当读到一个样式表时,浏览器会 ...
 - 特性Attibute定义和使用
			
1.定义特性 [AttributeUsage(AttributeTargets.Class,AllowMultiple = false,Inherited = false)] public class ...
 - spring mvc获取路径参数的几种方式
			
一.从视图向controller传递值, controller <--- 视图 1.通过@PathVariabl注解获取路径中传递参数 (参数会被复制到路径变量) @RequestMappin ...
 - Springboot集成mybatis通用Mapper与分页插件PageHelper
			
插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 Example 相关的单表操作.通用 Mapper 是为了解决 MyBatis 使用 ...
 - [Zabbix] 怎样实现邮件报警通知以及免费短信报警通知
			
前提条件: (1) zabbixserver端已经安装成功而且执行. (2) zabbixclient已经成功建立而且执行. 1 下载而且安装msmtp软件 Wget http://sourcefo ...
 - Android全局退出的两种方法
			
第一种方法参考<第一行代码>78页 建立一个ActivityCollector类,提供静态方法addActivity,fininshAll(以list为容器) 然后我们建立的Activit ...
 - js中常用的对象—String的属性和方法
			
今天说一下,js中常用的内置对象——String对象它有以下几个常用的属性:lengthprototype 有以下几个常用的方法:parseInt()转换为数字parseFloat()转换为数字,支持 ...
 - 69.类型后缀,重载操作符""
			
#include <iostream> using namespace std; class myclass { public: int num; int num2; public: my ...
 - Node.js  REPL(交互式解析器)
			
Node.js REPL(交互式解释器) Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中. 执行 - 执行输入的数据结 ...