AtCoder Beginner Contest 047

胖柚の工作室發表於2024-08-22

A - Fighting over Candies

簡單排序。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	vector<int> a(3);
	cin >> a[0] >> a[1] >> a[2];
	sort(a.begin(), a.end());
	if (a[2] == a[0] + a[1]) cout << "Yes";
	else cout << "No";
	return 0;
}

B - Snuke's Coloring 2 (ABC Edit)

如果著眼於計算被塗黑部分的面積就不利於計算。就本題而言應該直接去計算餘下的白色面積。這就需要端點座標。

分類討論:當 \(a\) 分別取值的時候,邊界的端點值會被更新(上一次塗黑的可能會被本次覆蓋),不斷更新端點值,最後根據矩形面積公式計算。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int W, H, N;
	cin >> W >> H >> N;
	int a1 = 0, a2 = W, a3 = 0, a4 = H;
	for (int i = 0; i < N; i++) {
		int x, y, a;
		cin >> x >> y >> a;
		if (a == 1) {
			a1 = max(a1, x);
		} else if (a == 2) {
			a2 = min(a2, x);
		} else if (a == 3) {
			a3 = max(a3, y);
		} else {
			a4 = min(a4, y);
		}
	}
	if (a2 <= a1 || a4 <= a3) cout << 0;
	else cout << (a2 - a1) * (a4 - a3);
	return 0;
}

C - 1D Reversi

透過在草稿紙上模擬可以看出,答案即為字串相鄰字元不相同的個數。
舉例:對於 WBBW,在最右邊增加 B,變為 WBBBB,只需在左側再加上一個 B 即可。也即每次增加的字元,都是把相鄰的不同字元更改為相同

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	string s;
	cin >> s;
	int ans = 0;
	for (int i = 1; i < s.size(); i++) {
		if (s[i] != s[i - 1]) ans++;
	}
	cout << ans;
	return 0;
}

D - An Invisible Hand

本題難在理解題意。以樣例三為例。
得到最高利潤的方式有多種,可以是 \(9-4=5,\) 也可以是 \(8-3=5\)
因此只需要統計有幾組這樣的最高利潤即可,答案就是組數。

對陣列遍歷,用 \(b[i]\) 記錄在當前城市出售蘋果所能得到的最高利潤,\(minn\) 表示前 \(i-1\) 個城市中的最小值,不斷更新 \(maxm\) 得到最高利潤。
再遍歷一遍,但凡 \(b[i]\)\(maxm\) 相等就將答案計數 + 1.

image

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N, T;
	cin >> N >> T;
	vector<int> a(N), b(N);
	
	int minn = 0x3f3f3f3f, maxm = -0x3f3f3f3f;
	for (int i = 0; i < N; i++) {
		cin >> a[i];
		b[i] = a[i] - minn;
		minn = min(minn, a[i]);
		maxm = max(maxm, b[i]);
	}
	int ans = 0;
	for (int i = 0; i < N; i++) {
		if (b[i] == maxm) ans++;
	}
	cout << ans;
	return 0;
}