817 字
2 分钟
Atcoder_Beginner_Contest_467(A~D题)
2026-07-19
浏览量 182 · 访客 14

题目链接:https://atcoder.jp/contests/abc467/tasks

A - Obesity#

根据题目给出的公式计算BMIBMI即可。注意输入的身高HH单位为厘米,需要先乘0.010.01转换为米,所以BMI=W(H×0.01)2BMI = \frac{W}{(H \times 0.01)^2}。最后判断BMIBMI是否大于等于2525,满足就输出YesYes,否则输出NoNo

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef 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#

对于第ii家商店,商品价格为AiA_i,支付了BiB_i,所以找零为BiAiB_i - A_i。当sis_itaketake时高桥拿走了找零,并没有产生损失;当sis_ikeepkeep时没有拿走找零,相比每次都拿走找零的情况就损失了BiAiB_i - A_i元。我们遍历所有商店,将所有keepkeep对应的找零累加起来就是最终答案。时间复杂度为O(N)O(N)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef 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)#

这题因为M=2M = 2,所以对一个数增加两次不会改变它模22的余数。因此每个AiA_i最多只需要增加一次,我们只需要判断哪些位置的奇偶性需要改变。
首先考虑不修改A1A_1的情况。我们从左往右遍历,对于当前位置ii,前面的AiA_i已经确定,如果(Ai+Ai+1)mod2Bi(A_i + A_{i + 1}) \bmod 2 \neq B_i,那么只能让Ai+1A_{i + 1}加一来满足条件,同时让操作次数cntcnt加一。这样一直遍历到末尾,就能得到一种合法方案。
不过A1A_1也可以选择加一。如果将上面方案中所有数的修改状态全部取反,即原来加一的数不加,原来不加的数加一,那么任意一对相邻的数都会同时改变两次,它们的和模22不变,所以仍然是一种合法方案。这个方案的操作次数就是NcntN-cnt
由于第一个数只有修改和不修改两种情况,后面的修改状态又都会被前一个数唯一确定,所以所有方案就在这两种情况中。最终答案为min(cnt,Ncnt)\min(cnt, N-cnt),时间复杂度为O(N)O(N)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef 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#

对于两个不同的点P,QP,Q,所有到P,QP,Q距离相等的点组成线段PQPQ的垂直平分线。也就是说,圆C1C_1的圆心必须在线段PQPQ的垂直平分线上。同理,圆C2C_2的圆心必须在线段RSRS的垂直平分线上。因此题目可以转化为判断这两条垂直平分线是否存在公共点。
令向量PQ=(a1,b1)\vec{PQ}=(a_1,b_1)RS=(a2,b2)\vec{RS}=(a_2,b_2)。如果它们的行列式a1b2a2b10a_1b_2-a_2b_1 \neq 0,说明两条线段不平行,那么它们的垂直平分线也不平行,一定存在唯一交点,直接输出YesYes
如果行列式等于00,两条垂直平分线相互平行,此时只有它们重合才存在公共点。我们将PQ\vec{PQ}除以gcd(a1,b1)\gcd(|a_1|,|b_1|)得到最简方向向量(dx,dy)(dx,dy)。线段PQPQ中点在这个方向上的投影可以用dx(Px+Qx)+dy(Py+Qy)dx(P_x+Q_x)+dy(P_y+Q_y)表示,这里使用坐标和代替中点坐标是为了避免浮点数。线段RSRS同理计算,如果两者投影相等,就说明两条垂直平分线重合,输出YesYes,否则输出NoNo
每组数据只进行了常数次计算,时间复杂度为O(TlogV)O(TlogV),其中VV为坐标差的绝对值,logVlogV来自求最大公约数。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef 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;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Atcoder_Beginner_Contest_467(A~D题)
https://mkrari.cn/posts/abc_467/
作者
Mkrari
发布于
2026-07-19
许可协议
CC BY-NC-SA 4.0