HDU

这个BFS并不是很好想。。 最主要的一点是每个余数只会被拿出来一次更新其他余数, 然后我用d[ i ]表示

到达 i 这个余数最短需要多长,然后从高位往低位贪心,判断成立的时候忘记了如果0被ban掉了这个判断会

出问题,都想到这里了为什么没有想到直接去bfs找答案呢??? 我TM蠢爆。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
using namespace std;

const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;

int n, m, tot, vis[N], from[N], who[N], ans[N];
bool is[15];
void init() {
    tot = 0;
    memset(vis, 0, sizeof(vis));
    memset(is, 0, sizeof(is));
}
int main() {
    int cas = 1;
    while(scanf("%d%d", &n, &m) != EOF) {
        init();
        for(int i = 1; i <= m; i++) {
            int x; scanf("%d", &x);
            is[x] = true;
        }
        queue<int> que;
        for(int i = 1; i < 10; i++) {
            if(is[i]) continue;
            if(i%n==0) {
                ans[tot++] = i;
                break;
            }
            vis[i%n] = 1;
            from[i%n] = 0;
            who[i%n] = i;
            que.push(i%n);
        }
        if(!tot) {
            while(!que.empty() && !tot) {
                int u = que.front(); que.pop();
                for(int i = 0; i < 10; i++) {
                    if(is[i]) continue;
                    int v = (u*10+i)%n;
                    if(!v) {
                        ans[tot++] = i;
                        while(u) {
                            ans[tot++] = who[u];
                            u = from[u];
                        }
                        reverse(ans, ans + tot);
                        break;
                    }
                    if(vis[v]) continue;
                    vis[v] = vis[u] + 1;
                    from[v] = u;
                    who[v] = i;
                    que.push(v);
                }
            }
        }
        printf("Case %d: ", cas++);
        if(!tot) puts("-1");
        else {
            for(int i = 0; i < tot; i++)
                printf("%d", ans[i]);
            puts("");
        }
    }
    return 0;
}

/*
*/
原文地址:https://www.cnblogs.com/CJLHY/p/9787767.html