• Codeforces Round #408 (Div. 2)ABCDE


    A. Buying A House

    分别向左右枚举,找到符合题意的点,输出最短的长度*10。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, k, s, a[105];
    int main()
    {
        scanf("%d%d%d", &n, &s, &k);
        for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
        int m = 100;
        for(int i = s+1; i <= n; i++){
            if(a[i] > 0 && a[i] <= k) {
                m = i-s;
                break;
            }
        }
        for(int i = s-1; i > 0; i--){
            if(a[i] > 0&& a[i] <= k){
                m = min(s-i, m);
                break;
            }
        }
        printf("%d
    ", m*10);
        return 0;
    }
    View Code

    B. Find The Bone

    模拟即可,如果掉进洞里输出,否则输出最后结果

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, m, k, a[1000005];
    int main() {
        scanf("%d%d%d", &n, &m, &k);
    
        for(int i = 1, x; i <= m; i++) {
            scanf("%d", &x);
            a[x] = 1;
        }
        if(a[1]) return 0*printf("1
    ");
        else {
            int u, v, x = 1;
            while(k--) {
                scanf("%d%d", &u, &v);
                if(x == u) {
                    x = v;
                    if(a[v]) return 0*printf("%d
    ", x);
                } else if(x == v) {
                    x = u;
                    if(a[u]) return 0*printf("%d
    ", x);
                }
            } printf("%d
    ", x);
        }
    
        return 0;
    }
    View Code

    C. Bank Hacking

    根据题意可知最大的结果不会超过 max{a_i}+2,

    设寻找的第一个点为x, x周围的点为第二次寻找的点为y,设z为x外圈的点,寻找的第一点对答案的贡献为 a[x]

    y对答案贡献为a[y]+1, z对答案恭喜为a[z]+2,因此决定答案的只有最大值max{a_i}和次大值{max_ai}-1(该值也可能不存在)

    因此我们可以枚举每个点作为第一次寻找的点,并记录该点最大值和次大值对最后答案的贡献

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, m, k, s, a[300005];
    
    int vis_small[300005], vis_big[300005];
    map<int, int>Map;
    
    int main() {
        scanf("%d", &n);
        s = 1;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            Map[a[i]]++;
            if(a[i] > a[s]) s = i;
        }
        int big = a[s], small = big - 1, big_num = Map[big], small_num = Map[small];
        //printf("%d %d %d %d
    ", big, small, big_num, small_num);
    
        for(int i = 0, u, v; i < n-1; i++) {
            scanf("%d%d", &u, &v);
            if(a[u] == big) vis_big[v]++;
            else if(a[u] == small) vis_small[v]++;
            if(a[v] == big) vis_big[u]++;
            else if(a[v] == small) vis_small[u]++;
        }
        int ans = big+2;
        for(int i = 1; i <= n; i++) {
            int xx, yy;
            if(a[i] == big) {
                if(big_num == 1) xx = big;
                else if(vis_big[i] == big_num-1) {
                    xx = big+1;
                } else xx = big+2;
                if(small_num == 0) yy = xx;
                else if(vis_small[i] == small_num) {
                    yy = big;
                } else yy = big+1;
            } else if(a[i] == small) {
                if(vis_big[i] == big_num) {
                    xx = big+1;
                } else xx = big+2;
                yy = xx;
            } else {
                if(vis_big[i] == big_num) {
                    xx = big+1;
                } else xx = big+2;
                yy = xx;
            }
            ans = min(ans, max(xx, yy));
        }
        printf("%d
    ", ans);
    
        return 0;
    }
    View Code

    D. Police Stations

    把所有的police同时放入队列,然后bfs.用map记录需要连接的边

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, k, d, cnt = 0;
    int vis[300005], x[300005], y[300005];
    
    typedef pair<int, int> P;
    vector<int>G[300005];
    queue<int>que;
    map<P, int>Map;
    
    int main() {
        scanf("%d%d%d", &n, &k, &d);
        for(int i = 1, x; i <= k; i++) {
            scanf("%d", &x);
            que.push(x);
            vis[x] = 1;
        }
        for(int i = 0, u, v; i < n-1; i++) {
            scanf("%d%d", &u, &v);
            x[i] = u, y[i] = v;
            Map[P(u, v)] = 1;
            G[u].push_back(v);
            G[v].push_back(u);
        }
        while(!que.empty()) {
            int u = que.front();
            que.pop();
            for(auto v : G[u]) {
                if(!vis[v]) {
                    que.push(v);
                    Map[P(u, v)] = 0;
                    Map[P(v, u)] = 0;
                    cnt++;
                    vis[v] = 1;
                }
            }
        }
        printf("%d
    ", n-1-cnt);
        for(int i = 0; i < n-1; i++) {
            if(Map[P(x[i], y[i])] > 0) printf("%d ", i+1);
        }
        //system("pause");
        return 0;
    }
    View Code

     E. Exam Cheating

    http://www.cnblogs.com/cshg/p/6708013.html

  • 相关阅读:
    MySql索引
    MySql事务、隔离级别
    41. 缺失的第一个正数
    442. 数组中重复的数据
    448. 找到所有数组中消失的数字
    转载:神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)
    转载:神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)
    697. 数组的度
    第三章 进程描述与控制
    C++ 对象成员函数(非静态方法)
  • 原文地址:https://www.cnblogs.com/cshg/p/6705667.html
Copyright © 2020-2023  润新知