• 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;
    }
    
    /*
    */
  • 相关阅读:
    笔试题 1.3 百度 2012 10.09 简答题 + 程设 --A
    windows中搜索dll的顺序
    笔试题 1.2 关于大文件处理:
    笔试题 1.1 最少比赛数目
    小优化
    LightOJ
    LightOJ
    LightOJ
    LightOJ
    LightOJ
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9787767.html
Copyright © 2020-2023  润新知