比赛链接: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;
}