当前位置: 首页 > news >正文

AtCoder Beginner Contest 376(A,B,C,D,E)(模拟,贪心,bfs,堆)

比赛链接

AtCoder Beginner Contest 376

A题

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;
int n, c;
int a[N];
void solve()
{cin >> n >> c;for (int i = 1; i <= n; i++){cin >> a[i];}int ans = 1, now = a[1];for (int i = 2; i <= n; i++){if (a[i] - now >= c){ans++;now = a[i];}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;// cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

B题

思路

n n n q q q的大小只有 100 100 100。在每一次询问时,直接暴力枚举向左移动还是向右移动即可。

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;int n, q;
void solve()
{cin >> n >> q;int L = 1, R = 2;int ans = 0;while (q--){char h;int t;cin >> h >> t;if (h == 'L'){bool ok = false;bool tmp = false;for (int i = 1, idx = L; i <= n; i++, idx++){if (idx == n + 1)idx = 1;if (idx == R)ok = true;if (idx == t){if (!ok)ans += (i - 1);elsetmp = true;}}if (tmp){for (int i = 1, idx = L; i <= n; i++, idx--){if (idx == 0)idx = n;if (idx == t){ans += (i - 1);}}}L = t;}else{bool ok = false;bool tmp = false;for (int i = 1, idx = R; i <= n; i++, idx++){if (idx == n + 1)idx = 1;if (idx == L)ok = true;if (idx == t){if (!ok)ans += (i - 1);elsetmp = true;}}if (tmp){for (int i = 1, idx = R; i <= n; i++, idx--){if (idx == 0)idx = n;if (idx == t){ans += (i - 1);}}}R = t;}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;// cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

C题

思路

a a a b b b排序之后,直接从大到小贪心即可。

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;int n;
int a[N], b[N];
void solve()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i < n; i++){cin >> b[i];}sort(a + 1, a + 1 + n);sort(b + 1, b + n);int cnt = 0;int idx = n - 1;for (int i = n; i >= 1; i--){if (idx > 0 && a[i] <= b[idx]){idx--;cnt++;}}if ((n - cnt) > 1){cout << -1 << endl;}else{int idx = n - 1;int op = n;for (int i = n; i >= 1; i--){if (a[i] > b[idx]){op = i;break;}elseidx--;}cout << a[op] << endl;}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;// cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

D题

思路

跑一遍bfs,直到第二次找到 1 1 1号节点。如果能找到,则打印最短距离,否则打印 − 1 -1 1

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;int n, m;
bool st[N];
vector<int> mp[N];
void solve()
{cin >> n >> m;for (int i = 1, a, b; i <= m; i++){cin >> a >> b;mp[a].push_back(b);}queue<pii> q;q.push({1, 0});st[1] = true;int ans = 0;while (q.size()){int u = q.front().first;int d = q.front().second;q.pop();for (int j : mp[u]){if (j == 1){ans = d + 1;cout << ans << endl;return;}if (st[j])continue;st[j] = true;q.push({j, d + 1});}}cout << -1 << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;// cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

E题

思路

按照 a a a的大小对两个数组进行从小到大排序。

枚举 a k ∼ a n a_{k} \sim a_{n} akan,也就是枚举 m a x i ∈ S a [ i ] max_{i \in S}a[i] maxiSa[i]

在枚举的过程中,用堆来维护 b b b数组的前 k k k小数即可。

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;int n, k;
struct node
{int a, b;
} p[N];
bool cmp(node x, node y)
{if (x.a != y.a)return x.a < y.a;return x.b < y.b;
}
void solve()
{cin >> n >> k;for (int i = 1; i <= n; i++){cin >> p[i].a;}for (int i = 1; i <= n; i++){cin >> p[i].b;}sort(p + 1, p + 1 + n, cmp);int ans = inf;int res = 0;priority_queue<int, vector<int>, less<int>> q;for (int i = 1; i <= k; i++){res += p[i].b;q.push(p[i].b);}ans = min(ans, p[k].a * res);for (int i = k + 1; i <= n; i++){int op = q.top();ans = min(ans, p[i].a * (res - op + p[i].b));q.push(p[i].b);res += p[i].b;op = q.top();q.pop();res -= op;}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

http://www.mrgr.cn/news/54035.html

相关文章:

  • 面试后的想法
  • LeetCode 每日一题 最小差值 I
  • 导出Excel的常用方法:从前端到后端的全面指南
  • 200台设备如何做到运行半年0故障?工厂设备管理这些环节是关键!
  • 数据结构与集合源码
  • 深入了解Spring重试组件spring-retry
  • 深度学习-29-AI大模型的相关知识和工业界AI项目落地的繁琐过程
  • 【Spark | Spark-Core篇】转换算子Transformation
  • Win32图片库CxImage在vs2022下的编译和使用
  • Python基础入门
  • Linux的基础指令
  • SHELL脚本之数组介绍
  • 压缩SQL Server 2014 数据库日志文件
  • 韩江荣获2024年诺贝尔文学奖:深度解读《植物妻子》《少年来了》和《素食者》
  • 【CTF刷题9】2024.10.19
  • 《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
  • Java--集合框架
  • 【OD】【E卷】【真题】【100分】补种未成活胡杨(PythonJavajavaScriptC++C)
  • 【C++】string类(2)
  • 选择、冒泡和插入排序及其优化版本课件
  • 揭秘A/B测试:如何用Z统计量和t统计量揭示成功背后的统计学奥秘
  • Linux——K8S平台的权限规划
  • 飞控开发软件有哪些?技术详解
  • 大模型照亮人工智能医疗助手的发展之路
  • CSP-J2023年复赛
  • 那些年 我们说走就走