Untitled

public
6shootingstar9 May 12, 2025 Never 10
Clone
Markdown paste1.txt 120 lines (111 loc) | 3.01 KB

题目意思就不用说了,懂的都懂。这道题其实直接 bfs 就能解决了(场上没细看啊啊啊)。

emmm,先结合样例,想想怎么利用bfs推出这个样例。给大家看个图:

(虽然说搬课件上的图有点儿可耻但是我懒得画了)

所以说这道题其实也没啥复杂的,直接分别从 1~k 开始一步一步搜就完事了(因为不能有前导 0,所以这里直接把 0 干掉了)。

下面先给大家看个我在赛后写的炸缸代码:

#include<bits/stdc++.h>
using namespace std;
int k,m;
int minn[1010];
void bfs()
{
    queue<string>q;
    q.push(to_string(0));
    while(!q.empty())
    {
        string tmp=q.front();
        q.pop();
        int num=0;
        for(int i=0;i<tmp.size();i++)
        {
            num*=10;
            num+=int(tmp[i]-'0');
        }
        for(int i=0;i<k;i++)
        {
            int a=num;
            a*=10;
            a+=k;//这个错误就纯抽象了。
            if(a%m==0&&a!=0)
            {
                cout<<a;
                return;
            }
            else if(a==0)
            {
                break;//同样也是一个很抽象的错误。
            }
            else
            {
                if(minn[a%m]>=a)
                {
                    break;
                }
                else
                {
                    minn[a%m]=a;
                }
            }
            q.push(to_string(a));
        }
    }
}
int main()
{
    cin>>k>>m;
    memset(minn,0x3f3f3f3f,sizeof(minn));
    bfs();
    return 0;
}

上面那个代码已知有两个离谱的错误,但是改完之后还是和改之前一样,输入样例根本没有输出(我在信友队上测的话就是直接还我一个 Wrong Answer 然后就没了,输出都没了)。

下面是正确的代码;

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int k,m;
int vis[N];
struct node
{
    string x;//这个数字
    int m;//余数
};
void bfs()
{
    queue<node>q;
    for(int i=1;i<k;i++)
    {
        vis[i]=1;
        q.push({to_string(i),i%m});//初始化,给1~k都扔要搜的节点里
    }
    while(!q.empty())
    {
        node x=q.front();
        q.pop();
        if(x.m==0)
        {
            cout<<x.x;
            return;
        }//余数为 0,直接输出,结束!
        for(int i=0;i<k;i++)
        {
            int nx=x.m*10+i;
            if(vis[nx%m])
            {
                continue;
            }
            vis[nx%m]=1;
            q.push({x.x+to_string(i),nx%m});//往后面加数字,判断这个数字的余数有没有被前面的数字搜到过,如果这个余数的值已经被搜到过了,直接不用管;否则这个数字继续入队。
        }
    }
}
int main()
{
    cin>>k>>m;
    bfs();//这里直接把 bfs 套上去就行。
    return 0;
}