当前位置: 首页 > news >正文

【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


迭代加深搜索。
枚举最大量maxdep
在dfs里面传剩余的要凑的分子、分母
以及上一次枚举的值是多少。
然后找到最小的k,满足1/k<=分子/分母
然后从max(k,last+1)开始枚举。
->剪枝就是剩余的全都用这个最大的分数。如果都不行就肯定不行了。
二分找这个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;
}

转载于:https://www.cnblogs.com/AWCXV/p/8159189.html

相关文章:

  • 仿腾讯固定导航栏
  • window进行缩放时左侧菜单高度随之变化
  • 如何将pdf文件的英文翻译成中文
  • mac用BootCamp装windows装完之后驱动问题
  • Jquery命名冲突解决的五种方案
  • 【margin与padding的区别与用法】
  • MyBatis JdbcType 与Oracle、MySql数据类型对应关系详解
  • 十三、视图
  • POJ3415 Common Substrings
  • Mysql-where子句与having子句的区别
  • 2017总结及2018计划
  • 使用tree生成目录结构
  • BGP 路由属性 公认必遵 AS_PATH
  • Spark之从hdfs读取数据
  • Python3之uuid模块
  • C++入门教程(10):for 语句
  • ES2017异步函数现已正式可用
  • ES6简单总结(搭配简单的讲解和小案例)
  • go语言学习初探(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Lucene解析 - 基本概念
  • Node 版本管理
  • Redux 中间件分析
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SQLServer之索引简介
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • WebSocket使用
  • windows下使用nginx调试简介
  • XML已死 ?
  • 警报:线上事故之CountDownLatch的威力
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 那些年我们用过的显示性能指标
  • 使用 Docker 部署 Spring Boot项目
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​MySQL主从复制一致性检测
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #pragma once
  • (10)ATF MMU转换表
  • (3)选择元素——(17)练习(Exercises)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (bean配置类的注解开发)学习Spring的第十三天
  • (办公)springboot配置aop处理请求.
  • (差分)胡桃爱原石
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十六)串口UART
  • (一)appium-desktop定位元素原理
  • (转)甲方乙方——赵民谈找工作
  • (转)四层和七层负载均衡的区别
  • ./和../以及/和~之间的区别
  • .net 流——流的类型体系简单介绍