牛客小白月赛100

news/2025/1/23 7:58:36/文章来源:https://www.cnblogs.com/PHarr/p/18405194

A - ACM中的A题

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;
#define int i64
using vi = vector<int>;const int N = 10;
char s[N];i32 main() {int a, b, c;cin >> a >> b >> c;int A = a * 2, B = b * 2, C = c * 2;if (A + b > c and A + c > b and b + c > A) {cout << "Yes\n";} else if (a + B > c and a + c > B and B + c > a) {cout << "Yes\n";} else if (a + b > C and a + C > b and b + C > a) {cout << "Yes\n";} else {cout << "No\n";}return 0;
}

B - ACM中的C题

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;
#define int i64
using vi = vector<int>;const int N = 10;
char s[N];i32 main() {int n;cin >> n;if (n == 1) {cout << -1;} else {cout << (n + 1) / 2;}return 0;
}

C - ACM中的M题

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;#define int i64using vi = vector<int>;i32 main() {ios::sync_with_stdio(false), cin.tie(nullptr);int n;cin >> n;vi a(n);for (auto &i: a) cin >> i;map<int, int> cnt;for (int i = 1, x; i <= n; i++)cin >> x, cnt[x]++;int res = 0;for (auto [_, b]: cnt) {if (b < 2) {cout << -1;return 0;}res += (b + 1) / 2;}cout << res;return 0;
}

D - ACM中的AC题

首先我们可以先用一遍 BFS 计算出每个点到最近的传送门的距离。

然后我们从起点开始进行 BFS,另世你和你关于起点对称。因此只维护你的位置就好,当你移动的时候,只要保证另世你的移动也合法即可。当你移动到传送门后,让另世你直接按照最短路移动到传送门即可,把两个距离求和就是答案。但是这里答案就是不满足单调了,所以找到所有的答案取最小值就好。

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;#define int i64using vi = vector<int>;
using pii = pair<int, int>;const vi dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};
const i64 INF = LLONG_MAX / 2;i32 main() {ios::sync_with_stdio(false), cin.tie(nullptr);int n, m, sx, sy;cin >> n >> m >> sx >> sy, sx--, sy--;vector<string> g(n);for (auto &i: g) cin >> i;vector dis1(n, vi(m, -1));queue<pii> q;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (g[i][j] == '@') q.emplace(i, j), dis1[i][j] = 0;while (not q.empty()) {auto [x, y] = q.front();q.pop();for (int i = 0, fx, fy; i < 4; i++) {fx = x + dx[i], fy = y + dy[i];if (fx < 0 or fy < 0 or fx >= n or fy >= m) continue;if (g[fx][fy] == '#') continue;if (dis1[fx][fy] != -1) continue;dis1[fx][fy] = dis1[x][y] + 1, q.emplace(fx, fy);}}vector dis(n, vi(m, -1));dis[sx][sy] = 0, q.emplace(sx, sy);sx = sx * 2, sy = sy * 2;int res = INF;while (not q.empty()) {auto [ax, ay] = q.front();q.pop();int bx = sx - ax, by = sy - ay;if (g[ax][ay] == '@' and dis1[bx][by] != -1)res = min(res, dis[ax][ay] + dis1[bx][by]);for (int i = 0, fx, fy, gx, gy; i < 4; i++) {fx = ax + dx[i], fy = ay + dy[i], gx = sx - fx, gy = sy - fy;if (fx < 0 or fy < 0 or fx >= n or fy >= m) continue;if (gx < 0 or gy < 0 or gx >= n or gy >= m) continue;if (g[fx][fy] == '#' or g[gx][gy] == '#') continue;if (dis[fx][fy] != -1) continue;dis[fx][fy] = dis[ax][ay] + 1;q.emplace(fx, fy);}}if (res >= INF) cout << -1;else cout << res;return 0;
}

E - ACM中的CM题

最优解肯定是先把\(m\)变大,然后再贪心覆盖区间就好了。

可以想到的情况是,随\(m\)变化,代价大概是符合三分的性质的。但是通过打表很容易就能找到不符合的情况。因此我们可以考虑通过三分大概先把区间变的小一点,然后再暴力的扫描剩下的区间。

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;#define int i64using vi = vector<int>;const vi dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};
const i64 INF = LLONG_MAX / 2;using node = array<int, 4>;
const node T = {-1, -1, -1, -1};i32 main() {ios::sync_with_stdio(false), cin.tie(nullptr);int n;cin >> n;vi a(n);for (auto &i: a) cin >> i;ranges::sort(a);auto [ret, lst] = ranges::unique(a);a.erase(ret, lst);int l = 0, r = a.back() - a.front();auto calc = [=](int m) -> int {int ans1 = 0, ans2 = 0;for (int i = 0, lst = -INF; i < a.size(); i++)if (a[i] > lst)ans1++, lst = a[i] + m;for (int i = a.size() - 1, lst = INF; i >= 0; i--)if (a[i] < lst)ans2++, lst = a[i] - m;return min(ans1, ans2) + m;};int T = 1e8 / a.size();while (r - l > T) {int len = (r - l) / 3, lmid = l + len, rmid = r - len;if (calc(lmid) < calc(rmid)) r = rmid;else l = lmid;}int res = INF;for (int i = l; i <= r; i++)res = min(res, calc(i));cout << res;return 0;
}

但是上述的代码的calc\(O(n)\)的。但实际上,因为有序,所以但我们知道左端点\(l\)时,是可以直接二分出右端点的。那么此时最多的二分次数也就是$\frac n m $。

这样的话,我们实际可以直接枚举\(m\),总复杂度就是\(O(\sum \frac{n}{m} \log n) = O(n\log ^ 2 n)\)

#include<bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;#define int i64using vi = vector<int>;const vi dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};
const i64 INF = LLONG_MAX / 2;using node = array<int, 4>;
const node T = {-1, -1, -1, -1};i32 main() {ios::sync_with_stdio(false), cin.tie(nullptr);int n;cin >> n;vi a(n);for (auto &i: a) cin >> i;ranges::sort(a);auto [ret, lst] = ranges::unique(a);a.erase(ret, lst);auto calc = [=](int m) -> int {int ans = m;for (int pos, lst = -INF; lst < a.back();) {ans++;pos = ranges::upper_bound(a, lst) - a.begin();lst = a[pos] + m;}return ans;};int res = INF;for (int i = 0; i <= a.back(); i++)res = min(res, calc(i));cout << res;return 0;
}

F - ACM中的ACM题

一个比较典的三元环问题,我们可以把无向图转换为有向图,规则是边一定从度数小的指向度数大的,如果度数相同从编号小的指向编号大的。这样的话有向图可以满足是一个有向无环图,且每个点的出度不超过\(\sqrt m\)

我们可以把和\(x\)相邻的所有点染色,然后枚举\(x\)的子节点\(y\),然后看\(y\)的子节点中有没有被染色的点。如果有则说明会形成三元环。

#include <bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;
using ldb = long double;const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;#define int i64const ldb eps = 1e-9;using vi = vector<int>;
using pii = pair<int, int>;const i64 mod = 998244353;class dsu {
private:vector<int> fa;
public:dsu(int n = 1) {fa = vector<int>(n + 1, -1), fa[0] = 0;}int getfa(int x) {if (fa[x] < 0) return x;return fa[x] = getfa(fa[x]);}void merge(int x, int y) {x = getfa(x), y = getfa(y);if (x == y) return;if (fa[x] > fa[y]) swap(x, y);fa[x] += fa[y], fa[y] = x;}bool same(int x, int y) {x = getfa(x), y = getfa(y);return (x == y);}int size(int x) {x = getfa(x);return -fa[x];}
};void solve() {int n, m;cin >> n >> m;vector<pii> edge(m);vi deg(n + 1);for (auto &[x, y]: edge)cin >> x >> y, deg[x]++, deg[y]++;vector<vector<pii>> e(n + 1);for (int cnt = 0; auto &[x, y]: edge) {if (deg[x] > deg[y]) swap(x, y);else if (deg[x] == deg[y] and x > y) swap(x, y);e[x].emplace_back(y, ++cnt);}dsu d(m);vi color(n + 1);for (int x = 1; x <= n; x++) {for (auto [y, i]: e[x]) color[y] = i;for (auto [y, i]: e[x])for (auto [z, j]: e[y])if (color[z])d.merge(i, j), d.merge(color[z], i);for (auto [y, i]: e[x]) color[y] = 0;}if (d.size(1) == m) cout << "Yes\n";else cout << "No\n";return;
}i32 main() {ios::sync_with_stdio(false), cin.tie(nullptr);int T;cin >> T;while (T-- > 0)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS中如何将本地代码上传到码云仓库

VS中如何将本地代码上传到码云仓库 方式一:点击“添加到源代码管理”VS底部栏点击“添加到源代码管理”,并选择“Git”选项在弹出窗口中,选择“其他→现有远程”选项,在右侧区域找到“远程URL”输入框,输入Gitee仓库地址,然后点击“创建并推送”按钮。此时项目目录会多出…

Linux下网络丢包故障定位

转载: 云网络丢包故障定位全景指南 硬件网卡丢包 Ring Buffer溢出如图所示,物理介质上的数据帧到达后首先由NIC(网络适配器)读取,写入设备内部缓冲区 Ring Buffer中,再由中断处理程序触发 Softirq 从中消费,Ring Buffer 的大小因网卡设备而异。当网络数据包到达(生产)…

第一次个人编程作业

github地址这个作业属于哪个课程 计科22级12班这个作业要求在哪里 作业要求链接这个作业的目标 遍历论文查重并封装成可执行文件,学习PSP和commit规范,学习测试和评估代码一、设计思路 文件结构:程序流程:实现逻辑:查找资料发现比较简单的实现是通过计算余弦向量来实现重复…

echart map图标切换多选,单选,默认选中

需求是echart默认地图选中之前的去过的城市,一开始多选,后面点击为单选const option = {tooltip: {trigger: item,formatter: {b}},series: [{type: map,roam : true,//是否开启缩放和平移zoom : 1,//当前视角缩放比例selectedMode: multiple, // 只允许单选// 设置为一张完整…

CH58x/CH59x/CH57x RF_PHY(2.4g)切换Channel发送接收

前言:在做某些应用的时候可能需要我们发送或者接收时切换对应的channel。 此次完成测试的平台在WCH的CH592F上完成的。 在工作发送过程中切换37、38、39三个信道进行轮询发送。具体需要使用最关键的函数是:RF_SetChannel 实现代码如下:if(events & channl_37_tx_evt){RF…

ArmSoM-Sige5 的 RK3576 SoC 主线内核支持进展

我们很高兴地宣布,基于 RK3576 SoC 的 ArmSoM-Sige5 开发板的主线内核支持,collabora正在稳步推进中。RK3576 SoC 是 Rockchip 家族的一员,其设计和功能与广受欢迎的 RK3588 相似,许多硬件模块都得到了复用,这为我们在主线内核中添加支持提供了有利条件。 RK3576主线内核…

P3579

今天有点高效啊,切数论题都这样喵? #include<bits/stdc++.h> using namespace std; int main() {int n,a,b,c,d,s,m;cin>>n;while(n--){cin>>a>>b>>c>>d; m=min(b,d);for(int i=1;i<=m;i++){i=min(b/(b/i),d/(d/i));//优化,只考虑b/…

机器学习作业

Ch3-K均值聚类算法 【9月4日】 学号:102102156 姓名:高涛 1. make_circles方法生成数据 1.1 源代码 from sklearn.cluster import KMeans from sklearn.datasets import make_circles, make_moons, make_blobs import matplotlib.pyplo…

volta 管理多个node版本时,Volta error: Could not download node

设置代理 在终端中执行以下命令,替换为你自己的代理地址: bash $env:HTTP_PROXY="你的代理地址" $env:HTTPS_PROXY="你的代理地址" 然后重启终端: Windows 用户需要以管理员身份重新打开终端。 Mac 用户只需重启终端即可。 这样可以确保你在终端中通过代…

el-upload点击问题

问题描述: 今天在写vue项目时,用到了element plus中的el-upload组件,发现这么一个问题: 组件各个功能都是正常的,也可以上传图片,但是 虚线框里那么大一片区域只有中间那个十字是可以点击的点击查看代码 <el-uploadclass="ImageUpload":action="http:/…

P2424

1.逃课做法 第一眼看到: 感觉有点像内啥分解只因数 然后就不会了那我写这个干什么 这时,聪明的我们就想到了打表 怎么打呢? 如图:我们可以把它分成几个块,提前打好每个块的答案 这样,我们就用普及的算法过了提高的题 2.正解 氧化钙(CaO)的怎么和上题一样 #include<c…

BinLLM论文阅读笔记

Text-like Encoding of Collaborative Information in Large Language Models for Recommendation论文阅读笔记 Abstract 现存的问题: ​ 在调整用于推荐的大型语言模型(LLMRec)时,整合协作信息至关重要。现有的方法通过从头开始学习 LLM 潜在空间中的协作嵌入或通过外部模…