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;
}
原文地址:https://www.cnblogs.com/quanjun/p/14474529.html