Codeforces Round #691 (Div. 2)
因為 pC 找不到 bug,就一直亂丟,於是打得超爛。Rating 加了 43 到 1695。
pA. Red-Blue Shuffle
1#include<bits/stdc++.h>
2using namespace std;
3typedef long long ll;
4typedef pair<int, int> pii;
5#define pb push_back
6int main() {
7 ios_base::sync_with_stdio(0); cin.tie(0);
8 int T; cin >> T;
9 while (T--) {
10 int n; cin >> n;
11 string R, B;
12 cin >> R >> B;
13 int r = 0, b = 0;
14 for (int i = 0; i < n; i++)
15 if (R[i] > B[i]) r++;
16 else if (R[i] < B[i]) b++;
17 if (r > b) cout << "RED\n";
18 else if (r < b) cout << "BLUE\n";
19 else cout << "EQUAL\n";
20 }
21 return 0;
22}
pB. Move and Turn
總共走 n 步,每走一步要從東西向換成左右向,問總共有幾種不同的終點?
首先,計算兩種各自需要走幾步,假設一種為 a 和 b 步,則各自有 a 和 b 種線性組合 (x - y = a),接下來考慮第一步為東西或南北,若 a 和 b 不同,則答案為 a * b * 2,否則為 a * b。
1#include<bits/stdc++.h>
2using namespace std;
3typedef long long ll;
4typedef pair<int, int> pii;
5#define pb push_back
6int main() {
7 ios_base::sync_with_stdio(0); cin.tie(0);
8 int n; cin >> n;
9 int a = n / 2, b = n - n / 2;
10 int ans = (a + 1) * (b + 1);
11 if (a != b) ans *= 2;
12 cout << ans << "\n";
13 return 0;
14}
pC. Row GCD
給定 1 ≤ n, m ≤ 2e5,給定 a1 ~ an, b1 ~ bm,回答 a1 + bj ~ an + aj 的最大公因數 GCDj。
輾轉相除法是用相減,所以直接用數列差的 GCD 去和 a1 + bj 取 GCD 即可。
需要小心 n = 1 的狀況,不小心踩到坑了 QAQ
1#include<bits/stdc++.h>
2using namespace std;
3typedef long long ll;
4typedef pair<int, int> pii;
5#define pb push_back
6int main() {
7 ios_base::sync_with_stdio(0); cin.tie(0);
8 int n, m; cin >> n >> m;
9 vector<ll> a(n);
10 for (int i = 0; i < n; i++)
11 cin >> a[i];
12 sort(a.begin(), a.end());
13 ll g = n > 1 ? a[1] - a[0] : 0;
14 for (int i = 2; i < n; i++)
15 g = __gcd(g, a[i] - a[0]);
16 for (int j = 0; j < m; j++) {
17 ll b; cin >> b;
18 cout << __gcd(g, a[0] + b) << " ";
19 }
20 return 0;
21}