AtCoder Beginner Contest 351 A-F题解

比赛链接:https://atcoder.jp/contests/abc351
比赛时间:2024 年 4 月 27 日 20:00-21:40

A题:The bottom of the ninth

标签:循环、模拟
题意:给定 A A A 9 9 9局的得分和 B B B 8 8 8局的得分。求 B B B队的第 9 9 9局要得多少分,才能总得分超过 A A A队。
题解:分别求出两队的总得分,如果 B B B队当前总得分已经超过 A A A队了,输出 0 0 0;否则输出相差的分数值 + 1 +1 +1(因为要超过)。
代码

#include <bits/stdc++.h>
using namespace std;int main() {// A队和B队 分别的得分之和int sum1 = 0, sum2 = 0, x;for (int i = 1; i <= 9; i++) {cin >> x;sum1 += x;}for (int i = 1; i <= 8; i++) {cin >> x;sum2 += x;}if (sum2 > sum1) cout << 0;else cout << sum1 - sum2 + 1;return 0;
}

B题:Spot the Difference

标签:数组、循环
题意:给定 N N Nx N N N的二维字符数组 A A A B B B。有一个坐标位置的字符不同,输出那个位置。
题解:输入两个二维数组,然后遍历每一个位置,看看字符是否相同,不同就输出那个位置坐标即可。
代码

#include <bits/stdc++.h>
using namespace std;char s1[105][105], s2[105][105];int main() {int n;cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> s1[i][j];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) {cin >> s2[i][j];if (s1[i][j] != s2[i][j]) {cout << i << " " << j;return 0;}}return 0;
}

C题:Merge the balls

标签:栈
题意:给定 n n n个球,第 i i i个球的大小是 2 a i 2^{a_i} 2ai。轮流将这 n n n个球加到一个序列中,一开始序列为空。每加一个球,如果序列的最后一个球和倒数第二个球大小相同,就将这两个球移除,然后加入一个新球,新球的大小是这两个球大小之和。不断地进行操作直到序列最后两个球不同或者序列中只有一个球了停止,然后再不断地加入球,直到这 n n n个球都被加入了。求最后序列中剩下的球的个数。
题解:我们分析下样例,比如以下这个样例:
7
2 1 1 3 5 3 3
加入到第 3 个球的时候,形成 2 1 1,最后两个相同了,删掉这两个,然后加入一个 2,形成 2 2;最后两个又相同了,删掉这两个,然后加入一个 3。
加入第 4 个球的时候,形成 3 3,最后两个相同了,删掉这两个,然后加入一个 4,形成 4。
加入第 5 个球,形成 4 5。
加入第 6、7 个球,形成 4 5 3 3,最后两个相同了,删掉最后两个,加入一个 4。
所以最后序列中剩下 4 5 4。
注意:题目中输入的是球的指数,如果两个球大小相同都是 2 a i 2^{a_i} 2ai,那么相加就是 2 ∗ 2 a i = 2 a i + 1 2*2^{a_i}=2^{a_{i+1}} 22ai=2ai+1
我们可以通过 模拟不断地将最后的两个拿出来,然后进行合并,塞一个新的放到栈中的这个流程,不断进行这个操作,直到最后球都放完了,最终输出栈的大小即可。
代码

#include <bits/stdc++.h>
using namespace std;stack<int> s;
int n, x;int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> x;s.push(x);while (s.size() >= 2) {int a = s.top(); s.pop();int b = s.top(); s.pop();if (a != b) {s.push(b);s.push(a);break;} else {s.push(a + 1);}}}cout << s.size() << endl;return 0;
}

D题:Grid and Magnet

标签:搜索
题意:给定一个 n n nx m m m的地图,地图中 # 表示不可以走,. 表示可以走。在此基础上加上一个限制,如果一个 . 周围上下左右中有一个位置有 #,就不能移动。求从 . 的地方走最多能到达的格子数。
题解:如果没有限制,就是普通的搜索了,暴力跑就好了。加上这个限制,如果我们像连通块一样,提前把某个格子跑到,并且因为 周围上下左右有一个#就不能移动,提前打上标记。后面其实从其他位置出发也能跑到这个格子,这个格子的计数就少了。
那如果我们跑每个点的时候,都对整张地图的 v i s vis vis 标记 m e m s e t memset memset 重置一下,那么总的时间复杂度又太大了。
这边可以引入一个类似标记第几个连通块的 i d id id,我们跑每个没有被标记的点,在跑的过程中发现如果能走到的下个点的 v i s vis vis标记和当前标记不一样,也让它跑下去,并打上当前 i d id id,这样就能统计到所有能够跑到的点。
代码

#include <bits/stdc++.h>
using namespace std;int n, m, cnt, ans = 0, num = 0;
char s[1005][1005];
int vis[1005][1005];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};bool check(int x, int y) {for (int i = 0; i < 4; i++) {int nx = x + dx[i], ny = y + dy[i];if (s[nx][ny] == '#') return 0;}return 1;
}void dfs(int x, int y, int id) {cnt++;vis[x][y] = id;if (!check(x, y)) return ;for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];if (nx < 1 || nx > n || ny < 1 || ny > m) continue;// 这边不判s[nx][ny]=='#' 因为前面check有判过了if (vis[nx][ny] == vis[x][y]) continue;dfs(nx, ny, id);}
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> s[i][j];for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (s[i][j] == '.' && !vis[i][j]) {cnt = 0;++num;dfs(i, j, num);ans = max(ans, cnt);}}cout << ans;return 0;
}

E题:Jump Distance Sum

标签:思维
题意:在坐标平面上,有 N N N个点 P 1 , P 2 , … , P N P_1,P_2,…,P_N P1,P2,,PN,其中点 P i P_i Pi的坐标为 ( X i , Y i ) (X_i,Y_i) (Xi,Yi)
两点 A A A B B B之间的距离 d i s t ( A , B ) dist(A,B) dist(A,B)定义如下:
一只兔子最初位于点 A A A。位置为 ( x , y ) (x,y) (x,y)的兔子可以跳跃到
( x + 1 , y + 1 ) 、 ( x + 1 , y − 1 ) 、 ( x − 1 , y + 1 ) (x+1,y+1) 、 (x+1,y−1) 、 (x−1,y+1) (x+1,y+1)(x+1,y1)(x1,y+1) ( x − 1 , y − 1 ) (x−1,y−1) (x1,y1)
d i s t ( A , B ) dist(A,B) dist(A,B)被定义为从 A A A点到 B B B点所需的最少跳跃次数。
如果经过任意次数的跳跃都无法从点 A A A到达点 B B B,则设为 d i s t ( A , B ) = 0 dist(A,B)=0 dist(A,B)=0
计算总和 ∑ i = 1 N − 1 ∑ j = i + 1 N dist ( P i , P j ) \displaystyle\sum_{i=1}^{N-1}\displaystyle\sum_{j=i+1}^N \text{dist}(P_i,P_j) i=1N1j=i+1Ndist(Pi,Pj)
题解:兔子的移动是对角移动,不太方便进行操作。我们可以把坐标轴旋转 45 % 45\% 45%,并缩放 2 \sqrt2 2 倍。那么 ( x , y ) (x,y) (x,y)点移动到 ( x + y , x − y ) (x+y,x-y) (x+y,xy)。比如 ( 2 , 2 ) (2,2) (2,2)变成 ( 2 2 , 0 ) (2\sqrt2,0) (22 ,0),放大 2 \sqrt2 2 倍,为 ( 4 , 0 ) (4,0) (4,0)
原来位置为 ( x , y ) (x,y) (x,y)的兔子可以跳跃到
( x + 1 , y + 1 ) 、 ( x + 1 , y − 1 ) 、 ( x − 1 , y + 1 ) (x+1,y+1) 、 (x+1,y−1) 、 (x−1,y+1) (x+1,y+1)(x+1,y1)(x1,y+1) ( x − 1 , y − 1 ) (x−1,y−1) (x1,y1)
我们转换后兔子可以从 ( x + y , x − y ) (x+y,x-y) (x+y,xy)跳跃到 ( x + y + 2 , x − y ) 、 ( x + y , x − y + 2 ) 、 ( x + y , x − y − 2 ) (x+y+2,x−y)、 (x+y,x−y+2) 、 (x+y,x−y−2) (x+y+2,xy)(x+y,xy+2)(x+y,xy2) ( x + y − 2 , x − y ) (x+y−2,x−y) (x+y2,xy)
转换成更通用的式子:兔子可以从 ( x , y ) (x,y) (x,y)跳跃到 ( x + 2 , y ) 、 ( x , y + 2 ) 、 ( x , y − 2 ) (x+2,y)、 (x,y+2) 、 (x,y−2) (x+2,y)(x,y+2)(x,y2) ( x − 2 , y ) (x−2,y) (x2,y)
那么我们观察到每次跳跃的距离都是偶数,也就是说如果 A = ( x 1 , y 1 ) , B = ( x 2 , y 2 ) A=(x_1,y_1),B=(x_2,y_2) A=(x1,y1)B=(x2,y2) ∣ x 1 − x 2 ∣ |x_1-x_2| x1x2不能被 2 2 2整除,或者 ∣ y 1 − y 2 ∣ |y_1-y_2| y1y2不能被 2 2 2整除,那么兔子就无法从 A A A到达 B B B
对于能到达的情况跳跃的最少次数显然等于 1 2 ( ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ ) \frac{1}{2}(\lvert x_1-x_2\rvert+\lvert y_1-y_2\rvert) 21(∣x1x2+y1y2∣)
也就是说对于能够相互到达的两个点 A A A B B B,他们的转化后的 x x x坐标的奇偶性和 y y y坐标的奇偶性必须相同。
我们可以统计一下对应转化后的 x x x奇/偶, y y y奇/偶的情况。然后去求一下对应情况下的跳跃次数。
这边举个例子:假设 x x x奇, y y y奇的情况,得到的 x x x的序列为
1 3 8 13 1\ \ \ 3\ \ \ 8\ \ \ 13 1   3   8   13
第二个 3 到 1 的距离为 1 段 2 的距离。
第三个 8 到前面两个点的距离为 2 段 8 的距离减去前缀前两个距离之和,即 2 ∗ 8 − ( 1 + 3 ) 2*8-(1+3) 28(1+3)
第四个 13 到前面两个点的距离为 3 段 13 的距离减去前缀 3 个距离之和,即 3 ∗ 13 − ( 1 + 3 + 8 ) 3*13-(1+3+8) 313(1+3+8)
注意题目中,转化后是 2 2 2的距离跳的,所以跳跃的次数最后要除以 2 2 2
代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll n, X, Y, ans = 0;
vector<ll> x[2][2], y[2][2];int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> X >> Y;x[(X+Y)%2][abs(X-Y)%2].push_back(X+Y);y[(X+Y)%2][abs(X-Y)%2].push_back(X-Y);}for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {int nx = x[i][j].size();int ny = y[i][j].size();if (nx == 0) continue;sort(x[i][j].begin(), x[i][j].end());sort(y[i][j].begin(), y[i][j].end());ll prex = x[i][j][0], prey = y[i][j][0];;for (int k = 1; k < nx; k++) {ans += k * x[i][j][k] - prex;prex += x[i][j][k];}for (int k = 1; k < ny; k++) {ans += k * y[i][j][k] - prey;prey += y[i][j][k];}}}cout << ans / 2;return 0;
}

F题:Double Sum

标签:扫描线、树状数组、线段树
题意:给定序列 A A A,计算 ∑ i = 1 N ∑ j = i + 1 N max ⁡ ( A j − A i , 0 ) \displaystyle \sum_{i=1}^N \sum_{j=i+1}^N \max(A_j - A_i, 0) i=1Nj=i+1Nmax(AjAi,0)
题解:观察公式,我们按照顺序遍历序列 A A A中的数,固定 A j A_j Aj,就变成了求当前数字和前面所有比自己小的数字之差的和。即公式: ∑ i = 1 j − 1 A j − A i \displaystyle \sum_{i=1}^{j-1} A_j - A_i i=1j1AjAi在满足条件 A j > A i A_j\gt A_i Aj>Ai的情况下。
我们将这个式子展开: A j ∑ i = 1 j − 1 − ∑ i = 1 j − 1 A i A_j\displaystyle \sum_{i=1}^{j-1} - \displaystyle \sum_{i=1}^{j-1}A_i Aji=1j1i=1j1Ai在满足条件 A j > A i A_j\gt A_i Aj>Ai的情况下。
通俗点讲,假设对于 A j A_j Aj来说,在它前面有 m m m个比它小的数 A i A_i Ai,那么值就是 m m m A j A_j Aj之和减去所有在第 j j j个数之前比它小的 A i A_i Ai之和。这个东西可以通过树状数组或者线段树进行维护。这题数据量比较大,需要离散化处理下。
代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const ll N = 4e5 + 10;
ll n, b[N], num[N], sum[N], ans = 0;
struct node {ll a, id;
}p[N];bool cmp1(node x, node y) {if (x.a == y.a) return x.id < y.id;return x.a < y.a;
}bool cmp2(node x, node y) {return x.id < y.id;
}ll lowbit(ll x) {return x & (-x);
}void update(ll *tree, ll x, ll k) {for (ll i = x; i <= n; i += lowbit(i)) tree[i] += k;
}ll query(ll *tree, ll x) {ll res = 0;for (ll i = x; i > 0; i -= lowbit(i)) res += tree[i];return res;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> p[i].a;p[i].id = i;}sort(p + 1, p + 1 + n, cmp1);for (int i = 1; i <= n; i++) b[p[i].id] = i;sort(p + 1, p + 1 + n, cmp2);for (int i = 1; i <= n; i++) {ans += p[i].a * query(num, b[i] - 1);ans -= query(sum, b[i] - 1);update(num, b[i], 1);update(sum, b[i], p[i].a);}cout << ans;return 0;
}

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

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

相关文章

Servlet(三个核心API介绍以及错误排查)【二】

文章目录 一、三个核心API1.1 HttpServlet【1】地位【2】方法 1.2 HttpServletRequest【1】地位【2】方法【3】关于构造请求 1.3 HttpServletResponse【1】地位【2】方法 四、涉及状态码的错误排查&#xff08;404……&#xff09;五、关于自定义数据 ---- body或query String …

计算机网络 备查

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元&#xff08;PDU&#xff09;和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段&#xff0c;并加上TCP头 4.网络层添加IP地址信息…

nuxt3使用记录五:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

Github Action Bot 开发教程

Github Action Bot 开发教程 在使用 Github 时&#xff0c;你可能在一些著名的开源项目&#xff0c;例如 Kubernetes&#xff0c;Istio 中看到如下的一些评论&#xff1a; /lgtm /retest /area bug /assign xxxx ...等等&#xff0c;诸如此类的一些功能性评论。在这些评论出现…

Django-基础篇

Django是一个开放源代码的Web应用框架&#xff0c;由Python语言编写。它遵循MVC&#xff08;Model-View-Controller&#xff09;的软件设计模式&#xff0c;使开发者能够以高效、可扩展和安全的方式构建Web应用程序。 Django具有以下特点和优势&#xff1a; 强大的功能&#x…

面试笔记——线程池

线程池的核心参数&#xff08;原理&#xff09; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)corePoolSize …

利用word2vec包将中文转变为词向量

代码展示&#xff1a; import jieba import re import json import logging import sys import gensim.models as word2vec from gensim.models.word2vec import LineSentence, loggerpattern u[\\s\\d,.<>/?:;\\"[\\]{}()\\|~!\t"#$%^&*\\-_a-zA-Z&…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

【docker】开放Docker端口

【docker 】 安装docker&#xff08;centOS7&#xff09;-CSDN博客 【docker】常用命令-CSDN博客 【docker】centos7配置docker镜像加速_docker仓库加速地址-CSDN博客 【docker】Hello World-CSDN博客 【docker 】Compose 使用介绍_docker compose 使用-CSDN博客 【docker…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

tidb离线本地安装及mysql迁移到tidb

一、背景&#xff08;tidb8.0社区版&#xff09; 信创背景下不多说好吧&#xff0c;从资料上查tidb和OceanBase“兼容”&#xff08;这个词有意思&#xff09;的比较好。 其实对比了很多数据库&#xff0c;有些是提供云服务的&#xff0c;有些“不像”mysql&#xff0c;综合考虑…

【如何使用SSH密钥验证提升服务器安全性及操作效率】(优雅的连接到自己的linux服务器)

文章目录 一、理论基础&#xff08;不喜欢这部分的可直接看具体操作&#xff09;1.为什么要看本文&#xff08;为了zhuangbility&#xff09;2.为什么要用密钥验证&#xff08;更安全不易被攻破&#xff09;3.密码验证与密钥验证的区别 二、具体操作1.生成密钥对1.1抉择&#x…

计算机复试项目:SpringCloud实战高并发微服务架构设计

秒杀购物商城--环境搭建 秒杀购物商城基础服务组件--详细介绍 秒杀购物商城基础服务--权限中心 秒杀购物商城业务服务--收货地址 秒杀购物商城业务服务--秒杀活动服务 秒杀购物商城--购物车的功能设计及分析 秒杀购物商城基础服务-用户中心 秒杀购物商城业务服务--商品中…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现 一、简单介绍 二、简单…

ArcGIS小技巧—模型构建器快速提取河网

上篇文章介绍的基于DEM的河网提取&#xff0c;需要使用多个工具&#xff0c;整体操作比较繁琐&#xff0c;在日常工作中&#xff0c;使用Arcgis提供的模型构建器可以帮助我们将多个工具整合在一起&#xff0c;在面对大量数据批量处理时&#xff0c;可以大大提高工作效率 利用模…

数字化wms仓库管理软件,实现企业仓储信息共享与智慧运行-亿发

在经济飞速发展的今天&#xff0c;企业面临着客户需求多样化、质量和交期要求提高以及激烈的市场竞争等挑战。在这样的背景下&#xff0c;许多企业开始考虑采用数字化仓储WMS系统来解决这些问题。 数字化仓储WMS系统通过打造高效、规范的仓库管理体系&#xff0c;实现了对产品…

爱普生晶振在物联网LoRa通讯中的应用

LoRa 是LPWAN通信技术中的一种&#xff0c;是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式&#xff0c;为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统&#xff0c;进而扩展传感网络…

神经网络高效训练:优化GPU受限环境下的大规模CSV数据处理指南

最近训练模型,需要加载wifi sci data 数据量特别大,直接干爆内存,训练也特别慢,快放弃了!随后冷静下来,然后靠着多年的经验,来进行层层优化,随诞生了这篇博客。 背景介绍 机器学习模型的训练通常需要大量的数据,尤其是对于深度神经网络模型。然而,当数据集非常庞大时…

网络之路29:三层链路聚合

正文共&#xff1a;1666 字 17 图&#xff0c;预估阅读时间&#xff1a;3 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…

新质生产力实践,我用chatgpt开发网站

是的&#xff0c;我用chatgpt开发了一个网站&#xff0c;很轻松。 我之前一点不懂前端&#xff0c;也没有网站开发的代码基础&#xff0c;纯正的0基础。 从0开始到最后成品上线&#xff0c;时间总计起来大致一共花了2-3周的时间。 初始想法我是想给我公司开发一个网站&#…