• [Offer收割]编程练习赛35


    有歧义的号码

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((int *)(x))) > (*((int *)(y))) ? 1 : -1;
    }
    int a[10], b[10];
    const int r[10] = { 0, 1, 2, -1, -1, 5, 9, -1, 8, 6 };
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n, d, x, y;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++){
            x = i, d = 0;
            if (x % 10 == 0) continue;
            bool flag = true;
            while (x){
                a[d++] = x % 10;
                x /= 10;
            }
            for (int j = 0; j < d; j++){
                b[j] = r[a[d - j - 1]];
                if (b[j] == -1) flag = false;
            }
            y = 0;
            for (int j = d - 1; j >= 0; j--){
                y = y * 10 + b[j];
            }
            if (y>n || y == i) flag = false;
            if (flag) printf("%d
    ", i);
        }
        return 0;
    }
    View Code

    最短游览路线

    算以1为源点的单源最短路,选择能走到1点的点中路径最短的一条加一输出。

    没考虑-1的情况,也过了。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((int *)(x))) > (*((int *)(y))) ? 1 : -1;
    }
    #include <vector>
    #include <queue>
    using namespace std;
    vector<int> G[10005];
    queue<int> q;
    bool inq[10005], v[10005];
    int d[10005];
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n, m, a, b, ans;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++){
            G[i].clear();
            d[i] = 0x3FFFFFFF;
        }
        d[1] = 0;
        memset(v, false, sizeof(v));
        for (int i = 0; i < m; i++){
            scanf("%d%d", &a, &b);
            G[a].push_back(b);
            if (b == 1) v[a] = true;
        }
        memset(inq, false, sizeof(inq));
        while (!q.empty()) q.pop();
        q.push(1);
        inq[1] = true;
        while (!q.empty()){
            int x = q.front();
            q.pop();
            inq[x] = false;
            for (int i = 0; i < G[x].size(); i++){
                int u = G[x][i];
                if (d[u]>d[x] + 1){
                    d[u] = d[x] + 1;
                    if (!inq[u]){
                        inq[u] = true;
                        q.push(u);
                    }
                }
            }
        }
        ans = 0x3FFFFFFF;
        for (int i = 1; i <= n; i++){
            if (v[i] && d[i] < ans) ans = d[i];
        }
        printf("%d
    ", ans + 1);
        return 0;
    }
    View Code

     重复字符串匹配

    缩写命名

    二分图匹配,字典中的单词是一个点集,S中的各个字母是一个点集,若最大匹配为|S|输出Yes,否则输出No。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1;
    }
    class MaxFlow_SAP {
    public:
    #define SAP_MAXN 20010
    #define SAP_MAXM 880010
    #define SAP_INF 0x3FFFFFFF
    
        struct Node {
            int from, to, next;
            int cap;
        } edge[SAP_MAXM];
        int tol;
        int head[SAP_MAXN];
        int dep[SAP_MAXN];
        int gap[SAP_MAXN];
        int cur[SAP_MAXN];
        int S[SAP_MAXN];
        int que[SAP_MAXN];
        int n;
        MaxFlow_SAP() {
            clear();
        }
        void clear() {
            tol = 0;
            memset(head, -1, sizeof(head));
        }
    
        void addedge(int u, int v, int w) {
            edge[tol].from = u;
            edge[tol].to = v;
            edge[tol].cap = w;
            edge[tol].next = head[u];
            head[u] = tol++;
            edge[tol].from = v;
            edge[tol].to = u;
            edge[tol].cap = 0;
            edge[tol].next = head[v];
            head[v] = tol++;
        }
        void BFS(int start, int end) {
            memset(dep, -1, sizeof(dep));
            memset(gap, 0, sizeof(gap));
            gap[0] = 1;
            int front, rear;
            front = rear = 0;
            dep[end] = 0;
            que[rear++] = end;
            while (front != rear) {
                int u = que[front++];
                if (front == SAP_MAXN) {
                    front = 0;
                }
                for (int i = head[u]; i != -1; i = edge[i].next) {
                    int v = edge[i].to;
                    if (dep[v] != -1) {
                        continue;
                    }
                    que[rear++] = v;
                    if (rear == SAP_MAXN) {
                        rear = 0;
                    }
                    dep[v] = dep[u] + 1;
                    ++gap[dep[v]];
                }
            }
        }
        int SAP(int start, int end) {
            int res = 0;
            BFS(start, end);
            int top = 0;
            memcpy(cur, head, sizeof(head));
            int u = start;
            int i;
            while (dep[start] < n) {
                if (u == end) {
                    int temp = SAP_INF;
                    int inser;
                    for (i = 0; i < top; i++)
                        if (temp > edge[S[i]].cap) {
                            temp = edge[S[i]].cap;
                            inser = i;
                        }
                    for (i = 0; i < top; i++) {
                        edge[S[i]].cap -= temp;
                        edge[S[i] ^ 1].cap += temp;
                    }
                    res += temp;
                    top = inser;
                    u = edge[S[top]].from;
                }
                if (u != end && gap[dep[u] - 1] == 0) {
                    break;
                }
                for (i = cur[u]; i != -1; i = edge[i].next)
                    if (edge[i].cap != 0 && dep[u] == dep[edge[i].to] + 1) {
                        break;
                    }
                if (i != -1) {
                    cur[u] = i;
                    S[top++] = i;
                    u = edge[i].to;
                } else {
                    int min = n;
                    for (i = head[u]; i != -1; i = edge[i].next) {
                        if (edge[i].cap == 0) {
                            continue;
                        }
                        if (min > dep[edge[i].to]) {
                            min = dep[edge[i].to];
                            cur[u] = i;
                        }
                    }
                    --gap[dep[u]];
                    dep[u] = min + 1;
                    ++gap[dep[u]];
                    if (u != start) {
                        u = edge[S[--top]].from;
                    }
                }
            }
            return res;
        }
    };
    char str[105], dict[105][105];
    MaxFlow_SAP sap;
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n, s, t;
        scanf("%d", &t);
        while (t--) {
            scanf("%d", &n);
            scanf("%s", str);
            s = strlen(str);
            for (int i = 0; i < n; i++) {
                scanf("%s", dict[i]);
            }
            sap.clear(), sap.n = n + s + 2;
            for (int i = 2; i <= n + 1; i++) {
                sap.addedge(1, i, 1);
            }
            for (int i = n + 2; i <= n + s + 1; i++) {
                sap.addedge(i, n + s + 2, 1);
            }
            for (int i = 0; i < n; i++) {
                int m = strlen(dict[i]);
                for (int j = 0; j < m; j++) {
                    for (int k = 0; k < s; k++) {
                        if (dict[i][j] == str[k]) {
                            sap.addedge(i + 2, n  + k + 2, 1);
                        }
                    }
                }
            }
            int maxflow = sap.SAP(1, n + s + 2);
            if (maxflow == s) printf("Yes
    ");
            else printf("No
    ");
            //1 2~n+1 n+2~n+s+1 n+s+2
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Vue 移动端向上滑动加载
    关于NPOI 判断Office 是否为空的操作
    定时任务的处理
    Web中线程与IIS线程池自动回收机制
    本地VS调试服务器 IIS 程序
    每天学点node系列-stream
    聊聊前端模块化开发
    位运算解决多标签问题【原创】
    <未来世界的幸存者> 读后感(现实篇和职业篇)【原创】
    Nest.js你学不会系列-初识Nest
  • 原文地址:https://www.cnblogs.com/dramstadt/p/7823133.html
Copyright © 2020-2023  润新知