
题目链接:https://atcoder.jp/contests/abc467/tasks
A - Obesity
根据题目给出的公式计算即可。注意输入的身高单位为厘米,需要先乘转换为米,所以。最后判断是否大于等于,满足就输出,否则输出。
#include <bits/stdc++.h>
using namespace std;using ll = long long;using ull = unsigned long long;#define endl '\n'#define mod 998244353typedef pair<ll, ll> pll;typedef pair<int, int> pii;
void solved() { int h, w; cin >> h >> w; if(w * 1.0 / (h * h * 0.0001) >= 25) cout << "Yes" << endl; else cout << "No" << endl;}
int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int _ = 1; //cin >> _; while (_--) { solved(); } return 0;}B - Keep the Change
对于第家商店,商品价格为,支付了,所以找零为。当为时高桥拿走了找零,并没有产生损失;当为时没有拿走找零,相比每次都拿走找零的情况就损失了元。我们遍历所有商店,将所有对应的找零累加起来就是最终答案。时间复杂度为。
#include <bits/stdc++.h>
using namespace std;using ll = long long;using ull = unsigned long long;#define endl '\n'#define mod 998244353typedef pair<ll, ll> pll;typedef pair<int, int> pii;
int a[110], b[110];
void solved() { int n; cin >> n; vector<string> s(n + 1); for(int i = 1; i <= n;i++){ cin >> a[i] >> b[i] >> s[i]; } ll ans = 0; for(int i = 1; i <= n;i++) if(s[i] == "keep") ans += b[i] - a[i]; cout << ans << endl;}
int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int _ = 1; //cin >> _; while (_--) { solved(); } return 0;}C - Adjacent Sums (easy)
这题因为,所以对一个数增加两次不会改变它模的余数。因此每个最多只需要增加一次,我们只需要判断哪些位置的奇偶性需要改变。
首先考虑不修改的情况。我们从左往右遍历,对于当前位置,前面的已经确定,如果,那么只能让加一来满足条件,同时让操作次数加一。这样一直遍历到末尾,就能得到一种合法方案。
不过也可以选择加一。如果将上面方案中所有数的修改状态全部取反,即原来加一的数不加,原来不加的数加一,那么任意一对相邻的数都会同时改变两次,它们的和模不变,所以仍然是一种合法方案。这个方案的操作次数就是。
由于第一个数只有修改和不修改两种情况,后面的修改状态又都会被前一个数唯一确定,所以所有方案就在这两种情况中。最终答案为,时间复杂度为。
#include <bits/stdc++.h>
using namespace std;using ll = long long;using ull = unsigned long long;#define endl '\n'#define mod 998244353typedef pair<ll, ll> pll;typedef pair<int, int> pii;
void solved() { int N, M; cin >> N >> M; vector<int> A(N + 1, 0), B(N, 0); for(int i = 1; i <= N;i++) cin >> A[i]; for(int i = 1; i < N;i++) cin >> B[i];
int cnt = 0; for(int i = 1; i < N;i++){ if((A[i] + A[i + 1]) % 2 != B[i]){ A[i + 1]++; cnt++; } } cout << min(cnt, N - cnt) << endl;}
int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int _ = 1; //cin >> _; while (_--) { solved(); } return 0;}D - Concentric Circles
对于两个不同的点,所有到距离相等的点组成线段的垂直平分线。也就是说,圆的圆心必须在线段的垂直平分线上。同理,圆的圆心必须在线段的垂直平分线上。因此题目可以转化为判断这两条垂直平分线是否存在公共点。
令向量,。如果它们的行列式,说明两条线段不平行,那么它们的垂直平分线也不平行,一定存在唯一交点,直接输出。
如果行列式等于,两条垂直平分线相互平行,此时只有它们重合才存在公共点。我们将除以得到最简方向向量。线段中点在这个方向上的投影可以用表示,这里使用坐标和代替中点坐标是为了避免浮点数。线段同理计算,如果两者投影相等,就说明两条垂直平分线重合,输出,否则输出。
每组数据只进行了常数次计算,时间复杂度为,其中为坐标差的绝对值,来自求最大公约数。
#include <bits/stdc++.h>
using namespace std;using ll = long long;using ull = unsigned long long;#define endl '\n'#define mod 998244353typedef pair<ll, ll> pll;typedef pair<int, int> pii;
void solved() { ll px, py, qx, qy, rx, ry, sx, sy; cin >> px >> py >> qx >> qy >> rx >> ry >> sx >> sy;
ll a1 = qx - px, b1 = qy - py; ll a2 = sx - rx, b2 = sy - ry;
ll determinant = a1 * b2 - a2 * b1; bool ok; if (determinant != 0) ok = true; else{ ll g = gcd(abs(a1), abs(b1)); ll dx = a1 / g, dy = b1 / g;
ll projection1 = dx * (px + qx) + dy * (py + qy); ll projection2 = dx * (rx + sx) + dy * (ry + sy); ok = projection1 == projection2; } std::cout << (ok ? "Yes" : "No") << endl;}
int main() { ios::sync_with_stdio(false), cin.tie(nullptr), std::cout.tie(nullptr); int _ = 1; cin >> _; while (_--) { solved(); } return 0;}