• AtCoder Beginner Contest 047 题解


    比赛链接:https://atcoder.jp/contests/abc047

    A - Fighting over Candies

    题目大意:
    三个数,问其中两个数之和能否等于剩下那个数。

    示例程序:

    #include <bits/stdc++.h>
    using namespace std;
    int a[3];
    int main() {
        for (int i = 0; i < 3; i ++) cin >> a[i];
        sort(a, a+3);
        puts( a[0]+a[1]==a[2] ? "Yes" : "No" );
        return 0;
    }
    

    B - Snuke's Coloring 2 (ABC Edit)

    题目大意:
    按照题目描述染色 (N) 轮,问二位平面没有染色的面积。

    解题思路:
    记录没有染色的行列的起止位置即可求出没有染色的区域面积。

    示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    int W, H, N, x, y, a, minx, maxx, miny, maxy;
    int main() {
        cin >> W >> H >> N;
        minx = 1, maxx = W, miny = 1, maxy = H;
        while (N --) {
            cin >> x >> y >> a;
            if (a == 1) minx = max(minx, x+1);
            else if (a == 2) maxx = min(maxx, x);
            else if (a == 3) miny = max(miny, y+1);
            else maxy = min(maxy, y);
        }
        if (minx > maxx || miny > maxy) puts("0");
        else cout << (maxx - minx + 1) * (maxy - miny + 1) << endl;
        return 0;
    }
    

    C - 1D Reversi

    题目大意:
    依次放 'B' 和 'W' 的球,按照题目描述,最少需要多少次能够让所有的球颜色相同。

    解题思路:
    相同字符组成的连续段的数量 (-1)

    示例程序:

    #include <bits/stdc++.h>
    using namespace std;
    char s[100010];
    int cnt;
    int main() {
        cin >> s;
        for (int i = 1; s[i]; i ++)
            if (s[i-1] != s[i])
                cnt ++;
        cout << cnt << endl;
        return 0;
    }
    

    D - An Invisible Hand

    题目大意:
    (n) 个数里面选两个数,答案为后一个数减前一个数的差的最大值。你现在需要修改一些数,将 (A_i) 修改为 (A_i') 的代价为 (|A_i - A_i'|),使答案至少小 (1),求最小代价。

    解题思路:
    (mx)(n) 个数中有多少个数可以最为后一个的较大值的,(mn)(n) 个数中有多少个数可以作为前一个的较小值的,则答案为 (min(mx,mn))

    示例程序:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010;
    int n, T, a[maxn], f[maxn], g[maxn], del, mx, mn;
    int main() {
        scanf("%d%d", &n, &T);
        for (int i = 1; i <= n; i ++) scanf("%d", a+i);
        f[1] = a[1];
        for (int i = 2; i <= n; i ++) f[i] = min(f[i-1], a[i]);
        g[n] = a[n];
        for (int i = n-1; i >= 1; i --) g[i] = max(g[i+1], a[i]);
        for (int i = 1; i < n; i ++) del = max(del, g[i+1] - f[i]);
        for (int i = 1; i < n; i ++) if (g[i+1] - a[i] == del) mn ++;
        for (int i = 2; i <= n; i ++) if (a[i] - f[i-1] == del) mx ++;
        printf("%d
    ", min(mn, mx));
        return 0;
    }
    
  • 相关阅读:
    [leetcode]_Search Insert Position
    [leetcode]_Merge Two Sorted Lists
    [leetcode]_Valid Parentheses
    喧闹中坚守底线-徘徊的行走在不知道路在何方的大地上。
    [leetcode]_Longest Common Prefix
    [leetcode]_Remove Nth Node From End of List
    [leetcode]_Roman to Integer
    [leetcode]_Palindrome Number
    策略模式(Strategy)
    面向对象
  • 原文地址:https://www.cnblogs.com/quanjun/p/14474529.html
Copyright © 2020-2023  润新知