AtCoder Beginner Contest 383
AtCoder Beginner Contest 383
//前三题都很水,只能写写这种题骗自己了
A - Humidifier 1
直接模拟
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
inline void solve() {
int n;
cin >> n;
int ans = 0;
int t = 0;
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
if (i == 1) {
t = x;
ans = y;
} else {
ans = max(ans - (x - t), 0ll);
ans += y;
t = x;
}
}
cout << ans << endl;
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
B - Humidifier 2
暴力枚举即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
inline void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<PII > num;
vector<vector<char>> arr(n + 2, vector<char>(m + 2));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
if (arr[i][j] == '.')num.push_back(make_pair(i, j));
}
}
int ans = 0;
auto get_sum = [&](int a, int b, int c, int d) {
int sum = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (arr[i][j] == '.') {
int dis1 = abs(a - i) + abs(b - j);
int dis2 = abs(c - i) + abs(d - j);
if (min(dis1, dis2) <= k)sum++;
}
}
}
return sum;
};
for (int i = 0; i < num.size(); i++) {
for (int j = i + 1; j < num.size(); j++) {
ans = max(get_sum(num[i].first, num[i].second, num[j].first, num[j].second), ans);
}
}
cout << ans << endl;
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
C - Humidifier 3
直接暴力
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
struct Node {
int x, y, s;
};
inline void solve() {
int n, m, k;
cin >> n >> m >> k;
int ans = 0;
queue<Node> q;
vector<vector<bool>> st(n + 1, vector<bool>(m + 1));
vector<vector<char>> arr(n + 1, vector<char>(m + 1));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 'H') {
q.push({i, j, k - 1});
st[i][j] = true;
ans++;
}
}
}
while (q.size()) {
for (int i = 0; i < 4; i++) {
int x = q.front().x + dx[i];
int y = q.front().y + dy[i];
if (x < 1 || x > n || y < 1 || y > m)continue;
if (arr[x][y] == '#' || st[x][y] || q.front().s < 0)continue;
if (q.front().s)q.push({x, y, q.front().s - 1});
st[x][y] = true;
ans++;
}
q.pop();
}
cout << ans << endl;
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
D - 9 Divisors
假设一个数分解质因数结果为
那么x的因子数等于
由此可知让因子数为9只有两种情况一种情况是
对于第一种情况需要确保
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
const int N = 2e6 + 7;
int prime[N];//质数存储于prime数组中,并且从下标0开始存储
bool vis[N];
int euler_sieve(int n) {
int cnt = 0;
memset(prime, 0, sizeof prime);
memset(vis, false, sizeof vis);
for (int i = 2; i <= n; i++) {
if (!vis[i])prime[cnt++] = i;
for (int j = 0; j < cnt; j++) {
if (i * prime[j] > n)break;
vis[i * prime[j]] = true;
if (i * prime[j] == 0)break;
}
}
return cnt;
}
inline void solve() {
int n;
cin >> n;
int ans = 0;
int cnt = euler_sieve(sqrt(n));
prime[cnt] = inf;
for (int i = 0; i < cnt; i++) {
int tmp = sqrt((n / pow(prime[i], 2)));
int pos = upper_bound(prime, prime + cnt, tmp) - prime - 1;
if (pos <= i)break;
ans += pos - i;
}
for (int i = 0;; i++) {
if (pow(prime[i], 8) <= n)ans++;
else break;
}
cout << ans << endl;
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
E - Sum of Max Matching
//挺好的一道题
观察题目,可以交换数组B的位置其实等价于可以可以交换A的位置,因为只需要最后答案,当然知道了这个也没有什么用。要让所有路径上最大值之和最小,如何确保最小呢?联想到最小生成树思考
思考如果A集合中与B集合由于一次
现在面对第二个问题,如何维护两个集合之间的相连情况呢?记录A与B数组中每个数出现次数,每次添边的时候新增的答案数量就是两者最小值,然后将剩余的边传递到该节点祖先以供后续使用
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf INT64_MAX
#define PII pair<int,int>
#define endl '\n'
const int N = 2e5 + 7;
int fa[N];
struct Node {
int u, v, w;
Node() {}
Node(int u, int v, int w) : u(u), v(v), w(w) {}
} node[N * 2];
int find(int x) {
if (fa[x] == x)return x;
return fa[x] = find(fa[x]);
}
void merge(int x, int y) {
fa[find(x)] = find(y);
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)fa[i] = i;
for (int i = 1; i <= m; i++) {
int x, y, w;
cin >> x >> y >> w;
node[i] = Node(x, y, w);
}
map<int, int> mp1, mp2;
for (int i = 1; i <= k; i++) {
int x;
cin >> x;
mp1[x]++;
}
for (int i = 1; i <= k; i++) {
int x;
cin >> x;
mp2[x]++;
}
auto cmp = [&](Node a, Node b) {
return a.w < b.w;
};
sort(node + 1, node + m + 1, cmp);
int ans = 0;
int num = 0;
int A = 0, B = 0;
for (int i = 1; i <= m; i++) {
int x = find(node[i].u), y = find(node[i].v);
if (x == y)continue;
int w = node[i].w;
mp1[y] += mp1[x];
mp2[y] += mp2[x];
int cnt = min(mp1[y], mp2[y]);
ans += w * cnt;
mp1[y] -= cnt;
mp2[y] -= cnt;
merge(x, y);
}
cout << ans << endl;
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
暂时倒闭了等一段时间再写F
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】