zoukankan      html  css  js  c++  java
  • Multiple(poj1465)

    Multiple
    Time Limit: 1000MS   Memory Limit: 32768K
    Total Submissions: 7183   Accepted: 1540

    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 smallest strictly positive multiple of N that has no other digits besides X1,X2..XM (if such a multiple exists).

    Input

    The input has several data sets separated by an empty line, each data set having the following format:

    On the first line - the number N
    On the second line - the number M
    On the following M lines - the digits X1,X2..XM.

    Output

    For each data set, the program should write to standard output on a single line the multiple, if such a multiple exists, and 0 otherwise.

    An example of input and output:

    Sample Input

    22
    3
    7
    0
    1
    
    2
    1
    1

    Sample Output

    110
    0
    题意:用下面所给的数字这些数构成的数字中找到是k的最小的倍数,每个数能用多次。
    思路:bfs;
    首先如果k为0的时候需要特判,然后将所给的数按升序排列,然后BFS的时候就能保证先被广搜到的数小。
    然后这样会爆,所以需要剪枝。
    我们要找的是k的倍数,那么这个数modk=0;然后看到k的范围很小。
    假如两个数A,B;
    A=n*k+s;B=m*k+s;
    也就是A=B(modk);那么当这两数去搜下一层的时候,A*10+b[i];
    B*10+b[i];那么这两个数对于k取余相等,所以我们只要将小的数加入队列。那么每个模数在队列中就出现一次就行,队列中的元素最多k个

    还有这个数了可能很大,所以用静态数组记录前驱去找数。
    C++超时,G++100多MS
      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <cstring>
      4 #include <cmath>
      5 #include <iostream>
      6 #include <algorithm>
      7 #include <map>
      8 #include <queue>
      9 #include <vector>
     10 #include<set>
     11 using namespace std;
     12 typedef long long LL;
     13 bool flag[6000];
     14 int ans[20];
     15 set<int>que;
     16 set<int>::iterator it;
     17 typedef struct pp
     18 {
     19         int mod;
     20         int id;
     21         int pre;
     22         int digit;
     23         pp()
     24         {
     25             pre=-1;
     26         }
     27 } ss;
     28 ss bns[1000000];
     29 int ask[1000000];
     30 int cp[2000000];
     31 int  bfs(int n,int m);
     32 int main(void)
     33 {
     34         int i,j,k;
     35         while(scanf("%d",&k)!=EOF)
     36         {
     37                 int n;
     38                 int m;
     39                 que.clear();
     40                 scanf("%d",&n);
     41                  for(i=0;i<n;i++)
     42                  {
     43                      scanf("%d",&cp[i]);
     44                  }
     45                  sort(cp,cp+n);
     46                  ans[0]=cp[0];
     47                 int uu=cp[0];
     48                 int t=1;
     49                  for(i=1;i<n;i++)
     50                  {
     51                      if(cp[i]!=uu)
     52                      {
     53                          ans[t++]=cp[i];
     54                          uu=cp[i];
     55                      }
     56                  }
     57 
     58                 if(k==0)printf("0
    ");
     59                 else
     60                 {
     61                         int sum=0;
     62                         int id=bfs(t,k);
     63                         if(id==-1)
     64                         {
     65                                 printf("0
    ");
     66                         }
     67                         else
     68                         {
     69                                 while(id!=-1)
     70                                 {
     71                                         ask[sum++]=bns[id].digit;
     72                                         id=bns[id].pre;
     73                                 }
     74                                 for(i=sum-1; i>=0; i--)
     75                                 {
     76                                         printf("%d",ask[i]);
     77                                 }
     78                                 printf("
    ");
     79                         }
     80                 }
     81         }
     82         return 0;
     83 }
     84 int  bfs(int n,int m)
     85 {
     86         int i,j,k;
     87         int kk=0;
     88         memset(flag,0,sizeof(flag));
     89         queue<ss>stc;
     90         for(i=0; i<n; i++)
     91         {
     92                 int mod=ans[i]%m;
     93                 if(!flag[mod]&&ans[i]!=0)
     94                 {
     95                         flag[mod]=true;
     96                         bns[kk].id=kk;
     97                         bns[kk].mod=mod;
     98                         bns[kk].pre=-1;
     99                         bns[kk].digit=ans[i];
    100                         stc.push(bns[kk]);
    101                         kk++;
    102                 }
    103         }
    104         while(!stc.empty())
    105         {
    106                 ss tt=stc.front();
    107                 stc.pop();
    108                 for(i=0; i<n; i++)
    109                 {
    110                         int mod=(tt.mod*10+ans[i])%m;
    111                         if(!flag[mod])
    112                         {
    113                                 bns[kk].id=kk;
    114                                 bns[kk].pre=tt.id;
    115                                 bns[kk].mod=mod;
    116                                 bns[kk].digit=ans[i];
    117                                 if(mod==0)
    118                                 {
    119                                         return kk;
    120                                 }
    121                                 stc.push(bns[kk]);
    122                                 kk++;
    123                                 flag[mod]=true;
    124                         }
    125                 }
    126         }
    127         return -1;
    128 }
    
    
    油!油!you@
  • 相关阅读:
    BZOJ4892: [Tjoi2017]dna
    BZOJ4307: Maishroom & Class
    NCEE2018游记
    BZOJ3720: Gty的妹子树
    BZOJ5055: 膜法师
    「奇技淫巧」博客园页面美化(差不多是划水
    白痴qwerta的胡言乱语(一句话日度感想?
    关于qwerta
    NOIP2018退役记
    「NOIP2017」「LuoguP3952」 时间复杂度(模拟,栈
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5731745.html
Copyright © 2011-2022 走看看