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.
#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;
}