zoukankan      html  css  js  c++  java
  • [Offer收割]编程练习赛36

    逃离单身节

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<vector>
    #include<algorithm>
    using std::vector;
    using std::sort;
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1;
    }
    #define pk putchar(' ')
    #define p_ putchar('_')
    #define pl putchar('
    ');
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) pk;
        for (int i = 0; i < n; i++) p_;
        for (int i = 0; i < 3 * n; i++) pk;
        for (int i = 0; i < n; i++) p_;
        pl;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) pk;
            putchar('/');
            for (int j = 0; j < n + i + i; j++) pk;
            putchar('\');
            for (int j = 0; j < n + n - 1 - i + n - 1 - i; j++) pk;
            putchar('/');
            for (int j = 0; j < n + i + i; j++) pk;
            putchar('\');
            pl;
        }
        putchar('/');
        for (int j = 0; j < 3 * n - 2; j++) pk;
        putchar('\');
        for (int j = 0; j < n; j++) p_;
        putchar('/');
        for (int j = 0; j < 3 * n - 2; j++) pk;
        putchar('\');
        pl;
        for (int i = 0; i < n; i++) {
            putchar('|');
            for (int j = 0; j < 7 * n - 2; j++) pk;
            putchar('|');
            pl;
        }
        for (int i = 0; i < 3 * n; i++) {
            for (int j = 0; j < i; j++) pk;
            putchar('\');
            if (i == 3 * n - 1) for (int j = 0; j < n; j++) p_;
            else for (int j = 0; j < 7 * n - 2 - 2 * i; j++) pk;
            putchar('/');
            pl;
        }
        return 0;
    }
    View Code

     小Hi的天平

    在并查集和二分图之间纠结了好久,直到看了别人的代码才想明白。一开始想的并查集是如果两件物品重量相等就合并两个集合,但这样一来面对一条不等关系的信息就毫无作为了。其实相等和不等表达的信息是等价的,都可以由第一个的种类推出第二个。这样一来,在同一个集合中的物品就之间的关系就不是“属于同一种物品”,而是“他们之间有逻辑关系”,只要确定一个集合中的任意一个是属于A还是B就能确定集合中所有的物品的种类。所以,读入一条xuv后,如果uv属于同一个集合,只需核实其关系是否正确即可;若不属于同一个集合,就合并两个集合。这题的关键代码是写在并查集的路径压缩上,一开始隐隐约约有感觉,但是太菜了,没想到。

    c[x]表示x节点与其所在集合根节点是否相同

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<vector>
    #include<algorithm>
    using std::vector;
    using std::sort;
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1;
    }
    class Union_Find_Set {
    #define MAX_UNION_FIND_SET_SIZE 100000
    public:
        int setSize;
        int father[MAX_UNION_FIND_SET_SIZE];
        int c[MAX_UNION_FIND_SET_SIZE];
        Union_Find_Set() {
            setSize = 0;
        }
        Union_Find_Set(int x) {
            setSize = x;
            clear();
        }
        void clear() {
            for (int i = 0; i < setSize; i++) {
                father[i] = i;
            }
            memset(c, 0, sizeof(c));
        }
        int getFather(int x) {
            if (x == father[x]) return x;
            int y = father[x];
            father[x] = getFather(father[x]);
            c[x] = c[x] ^ c[y];
            return father[x];
        }
        bool merge(int x, int a, int b) {
            int fa = getFather(a), fb = getFather(b);
            if (fa != fb) {
                father[fa] = fb;
                c[fa] = x ^ c[a] ^ c[b];
                return true;
            } else {
                return false;
            }
        }
        int countRoot() {
            int ret = 0;
            for (int i = 0; i < setSize; i++) {
                if (father[i] = i) {
                    ret++;
                }
            }
            return ret;
        }
    };
    Union_Find_Set ufs(10005);
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n, m, t;
        bool flag;
        scanf("%d", &t);
        while (t--) {
            flag = true;
            scanf("%d%d", &n, &m);
            ufs.clear();
            for (int i = 1; i <= m; i++) {
                int x, u, v;
                scanf("%d%d%d", &x, &u, &v);
                if (!flag) continue;
                int fu = ufs.getFather(u), fv = ufs.getFather(v);
                if (fu == fv) {
                    if ((ufs.c[u] ^ ufs.c[v]) != (x)) {
                        printf("sad
    %d
    ", i);
                        flag = false;
                    }
                } else {
                    ufs.merge(x, u, v);
                }
            }
            if (flag) printf("great
    ");
        }
        return 0;
    }
    View Code

     图书馆

    剩下30%的数据实在无能为力,绝望。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int cmp(const void * x, const void * y) {
        //x < y
        return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1;
    }
    long long a[1005];
    bool f[22005];
    int p[10000], cnt, c[10000];
    vector<int> q[10005], qq[10005];
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        memset(f, true, sizeof(f));
        f[0] = f[1] = false;
        for (int i = 2; i < 10000; i++)
            for (int j = i + i; j < 10000; j += i)
                f[j] = false;
        cnt = 0;
        for (int i = 0; i < 10000; i++) if (f[i]) p[cnt++] = i;
        for (int i = 0; i <= 10000; i++) {
            q[i].clear();
            qq[i].clear();
        }
        for (int i = 2; i <= 10000; i++) {
            int x = i;
            for (int j = 0; j < cnt; j++) {
                if (x == 1) break;
                int num = 0;
                while (x % p[j] == 0) {
                    num++;
                    x /= p[j];
                }
                if (num > 0) {
                    q[i].push_back(j);
                    qq[i].push_back(num);
                }
            }
        }
        int n, t;
        scanf("%d", &t);
        while (t--) {
            scanf("%d", &n);
            for (int i = 0; i < n; i++) {
                scanf("%lld", &a[i]);
                if (a[i] > 100) a[i] %= 100;
            }
            if (n > 100) {
                printf("0
    ");
                continue;
            }
            memset(c, 0, sizeof(c));
            int sum = 0;
            for (int i = 0; i < n; i++) sum += (int)a[i];
            for (int i = 2; i <= sum; i++) {
                for (int j = 0; j < q[i].size(); j++) {
                    c[q[i][j]] += qq[i][j];
                }
            }
            for (int i = 0; i < n; i++) {
                for (int j = 2; j <= a[i]; j++) {
                    for (int k = 0; k < q[j].size(); k++) {
                        c[q[j][k]] -= qq[j][k];
                    }
                }
            }
            int ans = 1;
            for (int i = 0; i < cnt; i++) {
                for (int j = 0; j < c[i]; j++) {
                    ans = (ans * p[i]) % 10;
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code

     命名的烦恼

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<vector>
    #include<algorithm>
    #include<iostream>
    #include<map>
    #include<queue>
    #include<string>
    using std::vector;
    using std::queue;
    using std::map;
    using std::sort;
    using std::string;
    #define read(x) scanf("%d", &x)
    #define reads(x) scanf("%s", x)
    #define write(x) printf("%d ", x)
    #define writes(x) printf("%s ", x)
    #define writeln(x) printf("%d
    ", x)
    #define writesln(x) printf("%s
    ", x)
    
    int cmp(const void * x, const void * y) {
    #define datatype int
        datatype dx = *((datatype *)(x)), dy = *((datatype *)(y));
        //x < y
        return dx > dy ? 1 : -1;
    #undef datatype
    }
    
    char a[20][105], str[20][105];
    int cost[20][20], dp[1 << 16][20];
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
        int n, m = 0;
        read(n);
        for (int i = 0; i < n; i++) reads(a[i]);
        for (int i = 0; i < n; i++) {
            bool flag = false;
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                if (flag) break;
                int li = strlen(a[i]), lj = strlen(a[j]);
                for (int k = 0; k + li - 1 < lj; k++) {
                    bool find = true;
                    for (int p = 0; p < li; p++) {
                        if (a[i][p] != a[j][k + p]) {
                            find = false;
                            break;
                        }
                    }
                    if (find) {
                        flag = true;
                        break;
                    }
                }
            }
            if (!flag) {
                memcpy(str[m], a[i], sizeof(a[i]));
                m++;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                if (i == j) continue;
                int common, li = strlen(str[i]), lj = strlen(str[j]);
                for (common = 0; common < li && common < lj; common++) {
                    bool match = true;
                    for (int k = 0; k < common; k++) {
                        if (str[i][li - common + k] != str[j][k]) {
                            match = false;
                            break;
                        }
                    }
                    if (match) cost[i][j] = lj - common;
                }
            }
        }
        memset(dp, 0x3F, sizeof(dp));
        for (int i = 0; i < m; i++) {
            dp[1 << i][i] = strlen(str[i]);
        }
        for (int i = 0; i < (1 << m); i++) {
            for (int j = 0; j < m; j++) {
                if (dp[i][j] == 0x3F3F3F3F) continue;
                for (int k = 0; k < m; k++) {
                    if (i & (1 << k)) continue;
                    if (dp[i | (1 << k)][k] > dp[i][j] + cost[j][k])
                        dp[i | (1 << k)][k] = dp[i][j] + cost[j][k];
                }
            }
        }
        int ans = 0x3FFFFFFF;
        for (int i = 0; i < m; i++) {
            if (dp[(1 << m) - 1][i] < ans) ans = dp[(1 << m) - 1][i];
        }
        writeln(ans);
        return 0;
    }
    View Code
  • 相关阅读:
    spring boot(二)web综合开发
    spring boot(一)入门
    shiro中单点登录
    shiro中SSL
    shiro中记住我功能
    spring中集成shiro
    OpenResty
    源代码安全审计
    Mycat读写分离 + 主从复制(Gtid)
    关于ansbile
  • 原文地址:https://www.cnblogs.com/dramstadt/p/7865964.html
Copyright © 2011-2022 走看看