• AtCoder Beginner Contest 176


    A Takoyaki

    大意:

    一次可以做x个饼,每次花t分钟,问做n个饼花多少分钟

    思路:

    向上取整即可,注意要用double强制转换一下

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> PII;
    int const MAXN = 2e5 + 10;
    
    int n, x, t;
    int main() {
        cin >> n >> x >> t;
        cout << (int)ceil((double)n / x) * t;
        return 0;
    }
    

    B Multiple of 9

    大意:

    问一个数是不是9的倍数:

    思路:

    直接每一位相加模9即可

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> PII;
    int const MAXN = 2e5 + 10;
    int n, m, T;
    
    int main() {
        string s;
        cin >> s;
        LL sum = 0;
        for (int i = 0; i < s.size(); ++i) {
            sum += s[i] - '0';
        }
        if (sum % 9)
            cout << "No";
        else
            cout << "Yes";
        return 0;
    }
    

    C Step

    大意:

    n个人站成一排,每个人向左看,必须每个人都不高于他,否则需要修改这个人的高度,直到满足左边的人都不高于他,问需要修改的高度和最小为多少

    思路:

    直接从左到右模拟即可

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> PII;
    int const MAXN = 2e5 + 10;
    int n, m, T, a[MAXN];
    
    int main() {
        cin >> n;
        LL res = 0;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            if (a[i] < a[i - 1]) {
                res += abs(a[i] - a[i - 1]);
                a[i] = a[i - 1];
            }
        }
        cout << res << endl;
        return 0;
    }
    

    D Wizard in Maze

    大意:

    走迷宫,可以直接走,也可以通过魔法跳到当前方格周围(5*5)的位置,"#"不可以走,"."可以走,问至少需要多少次魔法才能走到终点

    思路:

    走迷宫先想bfs,但是怎么bfs呢,因为如果能走到那么肯定没必要用魔法,而实在是走不到了,则必须要魔法,所以我们可以采用双端队列维护,如果能直接走到,就扔到队列的前面,如果需要跳,则扔到队列的后面,然后每次都从前面取即可,这样会先把能直接走到的取到,然后再走跳数最少的位置。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 1e3 + 5;
    typedef long long LL;
    int n, m, cx, cy, tx, ty, vis[N][N];
    int f[2][4] = {0, 0, 1, -1, 1, -1, 0, 0};
    char a[N][N];
    struct node {
        int x, y;
        int step;
    };
    void bfs() {
        deque<node> q;
        node start;
        start.x = cx;
        start.y = cy;
        start.step = 0;
        //vis[cx][cy] = 1;
        q.push_front(start);
        while (!q.empty()) {
            node now = q.front();
            q.pop_front();
            int x = now.x;
            int y = now.y;
            int step = now.step;
            if (vis[x][y] == 1) continue;
            vis[x][y] = 1;
            if (x == tx && y == ty) {
                cout << step << endl;
                return;
            }
            for (int i = 0; i < 4; i++) {
                int xx = x + f[0][i];
                int yy = y + f[1][i];
                if (xx >= 0 && xx < n && yy >= 0 && yy < m && vis[xx][yy] == 0&&a[xx][yy]=='.') {
                    //vis[xx][yy] = 1;
                    node ne;
                    ne.x = xx, ne.y = yy, ne.step = step;
                    q.push_front(ne);
                }
            }
            for (int i = x - 2; i <= x + 2; i++) {
                for (int j = y - 2; j <= y + 2; j++) {
                    if (i >= 0 && i < n && j >= 0 && j < m && vis[i][j] == 0&&a[i][j]=='.') {
                        //vis[i][j] = 1;
                        node ne;
                        ne.x = i, ne.y = j, ne.step = step + 1;
                        q.push_back(ne);
                    }
                }
            }
        }
        cout << -1 << endl;
        return;
    }
    
    int main() {
        cin >> n >> m;
        cin >> cx >> cy;
        cin >> tx >> ty;
        cx--, cy--, tx--, ty--;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> a[i][j];
            }
        }
        bfs();
        return 0;
    }
    

    E Bomber

    大意:

    给出一个(n*m)的矩阵,其中有M个目标,现在要安放一个地雷,这个地雷可以炸掉所在行和所在列的目标,问最多可以炸掉多少目标。

    (1 leq n, m leq 3 imes 10^5)

    (1 leq M leq minleft(n imes m, 3 imes 10^5 ight))

    思路:

    贪心的想,肯定是找到目标最多的行和列,然后判断一下这一行和这一列的交点有没有目标即可,如果有,那么答案需要减一。但是有可能有很多行或者列都是最多的,那么就需要找出他们全部的交点,看看有没有交点上没有目标的,如果有就直接输出答案,如果所有的交点上都有目标,那么直接输出答案减一即可。因为目标最多不超过3e5,所以枚举交点的数量不会超过3e5,否则一定会找到一个没有目标的交点,所以不会超时

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> PII;
    int const N = 3e5 + 10;
    int h, w, m;
    int row[N], col[N];
    int maxrow[N], mrow = 0;
    int maxcol[N], mcol = 0;
    set<pair<int, int>> tar;
    int main() {
        cin >> h >> w >> m;
        int max_row = 0, max_col = 0;
        for (int i = 0; i < m; i++) {
            int x, y;
            cin >> x >> y;
            tar.insert({x, y});
            row[x]++;
            col[y]++;
            max_row = max(max_row, row[x]);
            max_col = max(max_col, col[y]);
        }
        for (int i = 1; i <= h; i++) {
            if (row[i] == max_row) maxrow[mrow++] = i;
        }
        for (int i = 1; i <= w; i++) {
            if (col[i] == max_col) maxcol[mcol++] = i;
        }
        for (int i = 0; i < mrow; i++) {
            for (int j = 0; j < mcol; j++) {
                if (tar.count({maxrow[i], maxcol[j]}) == 0) {
                    cout << max_row + max_col << endl;
                    return 0;
                }
            }
        }
        cout << max(0, max_row + max_col - 1) << endl;
        return 0;
    }
    
    

    F Brave CHAIN

    大意:

    给出3N张牌,每次可以将最左边5张牌排序,然后删掉最左边的三张,如果这三张都相同,那么得一分,问最后能得多少分

    思路:

    实在不会 鸽了(题解:https://kaizynx.github.io/2020/08/23/AtCoder-ABC176F/)

  • 相关阅读:
    Android 中退出程序的几种方法
    POJ 1860 Currency Exchange (Bellman-Ford)
    HDU 5183 Negative and Positive (NP) (手写哈希)
    C++ 常见的cin的错误处理
    POJ 2287 Tian Ji -- The Horse Racing (贪心)
    HDU 1205 吃糖果 (鸽巢原理)
    HDU 1028 Ignatius and the Princess III (动态规划)
    HDU 3746 Cyclic Nacklace (KMP找循环节)
    Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
    HDU 2087 剪花布条 (KMP)
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/14224631.html
Copyright © 2020-2023  润新知