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

HDU1664 BFS + 数论 + 剪枝

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1664 , 一道比较蛋疼的搜索题。

  这道题有很多坑点,一点处理不好就要TLE。

 


 

  题意很简单,就是找到一个n的倍数m,要求m里包含的不同数字最少。

  做这道题要有数论的知识:对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。

  所以这里就比较好入手了,就是先搜一个数的情况,没找到的话再搜两个数的情况。

具体解法:

  用BFS来搜索,注意要有两个剪枝:如果当前队列里的结点的字符串的长度要比已经得到的结果的最小长度要长,则退出这次搜索;只有搜到的结点的数模n的余数未出现过,该节点才能入队,不然的话就会造成重复。还有不能在结点里直接保存字符串,所以要用一个前向指针来标记,需要得到字符串的时候进行一遍递归即可。

  用一个结构体来保存结点信息:当前结点模n的余数、前向指针、结点的字符、到该结点的字符串长度。由于数据量比较大,所以要自己手动维护一个队列。

  还有要注意的是,用string生成字符串的时候,ans = c + ans要比ans += c慢很多。

 

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 65536 + 5;
bool vis[maxn];
int MinLen , n , a[5];
struct Node {
    char ch;
    int mod , len , pre;    //余数 , 当前长度 , 前指针
} u , v , que[maxn];        
string ans , curans;

void GetStr(int k) {        //用递归来得到字符串信息,注意这里的写法
    if(k == -1)    return;
    GetStr(que[k].pre);
    curans += que[k].ch;
}
bool cmp(string a , string b) {        //比较两个串表示的十进制的大小
    if(a.size() > b.size())        return true;
    if(a.size() == b.size() && a > b)    return true;
    return false;
}
bool bfs(int k)
{
    memset(vis , 0 , sizeof(vis));
    int head = 0 , tail = -1;    //队列的首尾指针
    for(int i = 1 ; i <= k ; i++) {
        if(a[i] != 0) {        //这里是保证第一个数字不为0
            u.pre = -1;
            u.ch = a[i] + '0';
            u.mod = a[i] % n;
            u.len = 1;
            vis[u.mod] = 1;
            que[++tail] = u;
        }
    }
    while(head <= tail) {
        u = que[head];
        if(u.len > MinLen)    break;    //这里有一个剪枝
        for(int i = 1 ; i <= k ; i++) {
            v.mod = (u.mod * 10 + a[i]) % n;
            v.ch = a[i] + '0';
            v.len = u.len + 1;
            v.pre = head;
            if(!vis[v.mod]) {        //同余判重
                que[++tail] = v;
                vis[v.mod] = 1;
                if(v.mod == 0) {    //搜到了结果
                    curans = "";
                    GetStr(tail);    //获得字符串
                    return true;
                }
            }
        }
        head++;
    }
    return false;
}
int main()
{
    while(~scanf("%d" , &n) && n)
    {
        if(n <= 11) {
            cout << n << endl;
            continue;
        }
        bool flag = false;
        MinLen = maxn;
        ans = "";
        for(int i = 1 ; i <= 9 ; i++) {
            a[1] = i;
            if(bfs(1)) {
                if(!flag || cmp(ans , curans)) {
                    flag = true;
                    ans = curans;
                    MinLen = ans.size();
                } 
            }
        }
        if(flag) {
            cout << ans << endl;
            continue;
        }
        for(int i = 0 ; i <= 9 ; i++) {
            for(int j = i + 1 ; j <= 9 ; j++) {
                a[1] = i;    a[2] = j;
                if(bfs(2)) {
                    if(!flag || cmp(ans , curans)) {
                        flag = true;
                        ans = curans;
                        MinLen = ans.size();
                    }
                }
            }
        }
        cout << ans << endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/H-Vking/p/4508179.html

相关文章:

  • HP VA7400存储故障诊断,数据恢复有可能
  • 对创业的反思-自我定位
  • UITableView 基本使用方法总结
  • PHPExcel 长数字串显示为科学计数
  • .Mobi域名介绍
  • QueryDb
  • vmware、操作系统、数据库软件、oracle 补丁地址
  • 乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
  • C#学习笔记七索引器
  • sprint计划会议
  • 最简单的浏览器检测JavaScript代码
  • http statusCode(状态码)
  • 一步一步学Silverlight 2系列(5):实现简单的拖放功能
  • iis报错
  • Xcode 添加 Cocos2d-x Scene 模板
  • 5、React组件事件详解
  • AWS实战 - 利用IAM对S3做访问控制
  • CSS 提示工具(Tooltip)
  • leetcode讲解--894. All Possible Full Binary Trees
  • PHP变量
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • VUE es6技巧写法(持续更新中~~~)
  • 番外篇1:在Windows环境下安装JDK
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 爬虫模拟登陆 SegmentFault
  • 前端相关框架总和
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 手机端车牌号码键盘的vue组件
  • 学习笔记:对象,原型和继承(1)
  • FaaS 的简单实践
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (26)4.7 字符函数和字符串函数
  • (C++20) consteval立即函数
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)Sublime Text3配置Lua运行环境
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net 4.0并行库实用性演练
  • .Net Winform开发笔记(一)
  • .net 生成二级域名
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /etc/sudoer文件配置简析
  • [ Linux Audio 篇 ] 音频开发入门基础知识