[bfs+余数判重+路径记录] hdu 4474 Yet Another Multiple Problem

题意:

给一个n和m个数字(一位数)

求最小的n的倍数不含有这m个数字,不存在输出-1

思路:

首先有可能这个数超long long 所以无法暴力解决

所以这题应该是一个bfs

为什么能用余数判重呢

对于当前的余数进到队列里,一定是这个余数对应数的最小值

接下来再怎么添加到满足条件的后续东西应该是一样的

所以就可以余数判重了,类似数位dp的记录方式

然后再加上一个路径记录就好了

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"map"
#include"iostream"
using namespace std;
int used[12];
struct node
{
    int f,pre,now;  //f为是否出现,pre前驱,now当前的值
}mark[12345];
int n,m;
void dfs(int x)  //打印路径
{
    if(mark[x].pre) dfs(mark[x].pre);
    printf("%d",mark[x].now);
}
void bfs()
{
    int cur,next;
    queue<int>q;
    for(int i=1;i<=9;i++) //没有前导0 所以先放一位,所以一位数的时候要特判
    {
        if(used[i]) continue;
        q.push(i);
        mark[i].f=1;
        mark[i].pre=0;
        mark[i].now=i;
    }
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        for(int i=0;i<10;i++)
        {
            if(used[i]) continue;
            next=(cur*10+i)%n;
            if(mark[next].f) continue;
            mark[next].f=1;
            mark[next].now=i;
            mark[next].pre=cur;
            if(next==0)  //满足倍数
            {
                dfs(next);
                return ;
            }
            q.push(next);
        }
    }
    printf("%d",-1);
}
int main()
{
    int cas=1;
    while(scanf("%d%d",&n,&m)!=-1)
    {
        memset(used,0,sizeof(used));
        for(int i=0; i<m; i++)
        {
            int x;
            scanf("%d",&x);
            used[x]=1;
        }
        printf("Case %d: ",cas++);
        if(n<10&&!used[n])  //特判
        {
            printf("%d\n",n);
            continue;
        }
        memset(mark,0,sizeof(mark));
        bfs();
        puts("");
    }
    return 0;
}
时间: 2024-09-30 04:12:46

[bfs+余数判重+路径记录] hdu 4474 Yet Another Multiple Problem的相关文章

HDU 4474&amp;&amp;POJ 1465 BFS&amp;&amp;余数判重

两道题只是输入输出格式略有不同 给出n,m,m个数 要求生成一个数x,是n的倍数,并且只由这M个数构成(或不能含有这M个数中的任意一个),求最小的x,没有则输出-1(0): BFS找每一个满足n的倍数的数,用余数判重优化 对于给定两个数A,B,如果A和B模N都相同,设为C,即: A=x*N+C B=y*N+C 那么如果在A后面加上一个数字能够被N整除,则在B后面加上这个数字也肯定可以被N整除 即:(A*10+X)%N==(B*10+X)%N 因此可以利用模N的结果进行判重,只保留相同余数的最小数

poj1465Multiple(经典BFS+余数判重)

Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6936   Accepted: 1495 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM (at least one), finds the small

HDU 2579 Dating with girls(2) BFS 余数判重

对于石头的处理就按照每个位置的时间取k的余数判一下重复就好,其他随意写 #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queue> #include <deque> #include

HDU 4474 Yet Another Multiple Problem【2012成都regional K题】 【BFS+一个判断技巧】

Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 3407    Accepted Submission(s): 825 Problem Description There are tons of problems about integer multiples. Despit

HDU 4474 Yet Another Multiple Problem

Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 4734    Accepted Submission(s): 1021 Problem Description There are tons of problems about integer multiples. Despit

【暴力+BFS】HDU 4474 Yet Another Multiple Problem

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4474 题意:给出n和m个数位,求一个数X,这个数是n的最小倍数且他的每一位都不含有m个数位中的任意一个. 思路:反过来想,其实就是有非M的元素组成一个数,这个数是N的倍数.如果存在解,那么他的第一位便是非M组合中的任意一位,然后除N后,他的余数便是X-a*n,那么下一位除N的就是(X-a*n)*10+(枚举的下一个非M元素),要求最小这个数,那么BFS跑最短就可以了. 代码:https://github

11198 - Dancing Digits(BFS + hash判重)

题目:11198 - Dancing Digits 题目大意:每组数据给出8个数字,可能正可能负.要求最后将这8个数字按照数字绝对值从小到大的排序.排序的规则是让某个数字a邀请另一个数字b跳舞,这样a就可以插到b的左边或是右边,a能邀请b跳舞,则a* b <0 ,且a+b要是素数.题目问给出一组数据问能否通过邀请跳舞来排序,能的话就输出最少的邀请次数,否则输出-1. 解题思路:这题一开始竟然想着dfs,但是后面发现,这样的判断树可以是无限大,因为可以a邀请完b,然后b在邀请a,这样一来一回有可能

Keyboarding (bfs+预处理+判重优化)

# #10030. 「一本通 1.4 练习 2」Keyboarding [题目描述] 给定一个 $r$ 行 $c$ 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 $5$ 个控制键,你可以移动电视屏幕上的光标来打印文本.一开始,光标在键盘的左上角,每次按方向键,光标总是跳到下一个在该方向上与当前位置不同的字符,若不存在则不移动.每次按选择键,则将光标所在位置的字符打印出来. 现在求打印给定文本(要在结尾打印换行符)的最少按键次数. [算法] 1.预处理四个方向能到达的点.

HDOJ 4474 Yet Another Multiple Problem

BFS..... Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 3307    Accepted Submission(s): 806 Problem Description There are tons of problems about integer multiple