AtCoder Beginner Contest 353 A~E(F,G更新中...)

A.Buildings

题意

给出若干个建筑,每个建筑有一个高度,问,从第二个建筑开始,比第一个建筑高的建筑中编号最小的是多少?如果不存在,输出-1.

分析

边输入边比较即可,如果循环结束还未找到,输出-1.

代码

#include<bits/stdc++.h>using namespace std;int a[200005];void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];if (i - 1 && a[i] > a[1]) {cout << i << endl;return;}}cout << -1 << endl;
}int main() {solve();return 0;
}

B.AtCoder Amusement Park(模拟)

题意

n n n个小团体需要乘坐小船,第 i i i个团体有 a i a_i ai个人,而小船只有 k k k个座位。同时,小团体需要按照给出的顺序来乘坐小船,且同一个团体中的人必须乘坐同一艘小船,问,需要多少只小船,才能满足所有的小团体。

分析

模拟即可,每次检查当前小船是否还能放下当前的团体人数,如果够,就加入当前小船中,如果不够,开一艘新的小船,用于放置当前的小团体。

代码

#include<bits/stdc++.h>using namespace std;int a[200005];void solve() {int n, k;cin >> n >> k;int sum = 0, cnt = 1;for (int i = 1; i <= n; i++) {int a;cin >> a;sum += a;if (sum > k) {sum = a;cnt++;}}cout << cnt << endl;
}int main() {solve();return 0;
}

C.Sigma Problem(前缀和+二分)

题意

给出一个函数 f ( x , y ) = ( x + y ) f(x, y) = (x + y) % 10^{8} f(x,y)=(x+y),求:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( a i , a j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n} f(a_i, a_j) i=1n1j=i+1nf(ai,aj)

分析

由于给出的函数 f ( x , y ) f(x, y) f(x,y)是将两个数字相加,而加法是可交换的,那么 f ( x , y ) = f ( y , x ) f(x, y) = f(y, x) f(x,y)=f(y,x)。 然后求和要求的是任意两个不同数字经过函数运算后相加的结果,那么任意交换给出的数字是不会改变答案的。

因此,为了便于处理,可以把数组排序。

排序完成后,可以先维护前缀和,因为不难发现,对于每个 a [ i ] a[i] a[i],均需要与前面每个数字进行一次函数运算,那么在不考虑取模的情况下,产生的结果为 p r e [ i − 1 ] + ( i − 1 ) × a [ i ] pre[i - 1] + (i - 1) \times a[i] pre[i1]+(i1)×a[i],其中 p r e [ i − 1 ] pre[i - 1] pre[i1]表示前 i − 1 i - 1 i1个数字的前缀和。

然后考虑取模需要减掉的部分,不难想到,对于 x + y < 1 0 8 x + y < 10^{8} x+y<108的情况,是不需要进行取模的,而 x + y ≥ 1 0 8 x + y \ge 10^{8} x+y108时,则每次运算的取模均相当于减去一个 1 0 8 10^{8} 108,由于数组已经经过排序了,那么只需要通过二分对 1 0 8 − a [ i ] 10^{8} - a[i] 108a[i]进行查找,就可以知道需要减去的数字所在的起点是多少,那么这个查找到的位置到下标 i − 1 i - 1 i1之间的所有数字与当前数字 a [ i ] a[i] a[i]进行运算,均需要减掉 1 0 8 10^{8} 108,令 c n t cnt cnt为需要减去的数量,则 a [ i ] a[i] a[i]产生的贡献为

  • p r e [ i − 1 ] + ( i − 1 ) × a [ i ] − c n t ∗ 1 0 8 pre[i - 1] + (i - 1) \times a[i] - cnt * 10^{8} pre[i1]+(i1)×a[i]cnt108

代码

#include<bits/stdc++.h>using namespace std;
typedef long long ll;const int mod = 1e8;
ll a[300005], pre[300005];void solve() {ll n;ll ans = 0;cin >> n;for (ll i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + n + 1);for (ll i = 1; i <= n; i++) {pre[i] = pre[i - 1] + a[i];}for (ll i = 2; i <= n; i++) {int id = lower_bound(a + 1, a + i, mod - a[i]) - a;ans += pre[i - 1] + (i - 1) * a[i] - (mod * (i - id));}cout << ans << endl;
}int main() {solve();return 0;
}

D.Another Sigma Problem(后缀和)

题意

给出一个函数 f ( x , y ) = x y f(x, y) = xy f(x,y)=xy

例:

  • f ( 3 , 14 ) = 314 f(3, 14) = 314 f(3,14)=314

  • f ( 100 , 1 ) = 1001 f(100, 1) = 1001 f(100,1)=1001

请你求出以下操作取模后的结果:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( a i , a j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n}f(a_i, a_j) i=1n1j=i+1nf(ai,aj)

分析

当前给出的函数 f ( x , y ) f(x, y) f(x,y)可以将数字分为两个部分,前半部分需要乘上 1 0 y的十进制位数 10^{\text{y的十进制位数}} 10y的十进制位数,后半部分直接加上。

那么对于 a i a_i ai来说,与前面的 i − 1 i - 1 i1个数字运算后,产生的贡献为 ( i − 1 ) × a i (i - 1) \times a_i (i1)×ai,与后面的 n − i n - i ni个数字运算后,产生的贡献为 ∑ j = 1 10 1 0 j × c n t j × a i \sum\limits_{j = 1}^{10} 10^{j} \times cnt_j \times a_i j=11010j×cntj×ai,其中 c n t j cnt_j cntj表示 a i + 1 ∼ a n a_{i + 1} \sim a_n ai+1an中十进制位数为 j j j的数字数量。

对于 ( i − 1 ) × a i (i - 1) \times a_i (i1)×ai,可以直接通过计算得到,而 c n t j cnt_j cntj可以通过预处理后缀和来快速计算得到,即使用 n x t [ i ] [ j ] nxt[i][j] nxt[i][j]表示 i ∼ n i \sim n in之间十进制位数为 j j j的数字个数.

代码

#include<bits/stdc++.h>using namespace std;
typedef long long ll;const int mod = 998244353;
ll a[300005], nxt[300005][15];int getlen(int x) {int cnt = 0;while (x) {cnt++;x /= 10;}return cnt;
}void solve() {ll n;ll ans = 0;cin >> n;for (ll i = 1; i <= n; i++) {cin >> a[i];}for (ll i = n; i >= 1; i--) {for (int j = 1; j <= 10; j++) {nxt[i][j] = nxt[i + 1][j];}nxt[i][getlen(a[i])]++;}for (ll i = 1; i <= n; i++) {ans += (i - 1) * a[i] % mod;ans %= mod;ll mul = 1;for (int j = 1; j <= 10; j++) {mul *= 10;ans = (ans + mul * nxt[i + 1][j] % mod * a[i] % mod) % mod;}}cout << ans << endl;
}int main() {solve();return 0;
}

E.Yet Another Sigma Problem(哈希)

题意

给出一个函数 f ( x , y ) f(x, y) f(x,y),表示字符串 x x x y y y的最长公共前缀长度。

请你求出:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( S i , S j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n}f(S_i, S_j) i=1n1j=i+1nf(Si,Sj)

分析

可以不用直接考虑当前字符串与前面所有字符串中的最长公共前缀长度,而是依次考虑长为 1 ∼ S i . s i z e ( ) 1 \sim S_i.size() 1Si.size()的前缀在前面的字符串中作为前缀的个数。

为什么可以这么做?

不难想到,此时将所有长度的字符串均设置为贡献1,那么长度为1的前缀会产生1点贡献,长度为2的前缀也会产生1点贡献,依次类推,最后计算出的贡献与所求的答案是一致的。

而字符串匹配是比较麻烦的,很难快速的进行检查,因此,可以使用哈希将字符串转化为数字(为了避免冲突,这里选择了双模数),而转化成的数字范围也是较大的,使用数组并不方便维护,可以使用map进行维护,即 m a p [ x ] = y map[x] = y map[x]=y表示字符串 x x x作为前缀的出现次数为 y y y

那么对于每个字符串,枚举这个字符串所有的前缀字符串,然后加上这个前缀在前面字符串中的出现次数,并将该前缀更新到map中。

代码

#include<bits/stdc++.h>using namespace std;
typedef long long ll;map<pair<int, int>, int> H;int base = 131, mod[] = {1000000007, 998244353};void solve() {int n;cin >> n;ll ans = 0;for (int i = 1; i <= n; i++) {string s;ll hashCode[5] = {0, 0};cin >> s;for (auto j : s) {hashCode[0] = (hashCode[0] * base % mod[0] + j) % mod[0];hashCode[1] = (hashCode[1] * base % mod[1] + j) % mod[1];ans += H[make_pair(hashCode[0], hashCode[1])];H[make_pair(hashCode[0], hashCode[1])]++;}}cout << ans << endl;
}int main() {solve();return 0;
}

F,G更新中…

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

阿里开源编程大模型 CodeQwen1.5:64K92编程语言,Code和SQL编程,评测接近GPT-4-Turbo

前言 阿里巴巴最近发布的CodeQwen1.5模型标志着其在编程语言模型领域的一次重大突破。这款开源模型不仅支持高达92种编程语言和64K的上下文长度&#xff0c;而且在多项性能评测中显示出接近或超过当前行业领导者GPT-4-Turbo的能力。 Huggingface模型下载&#xff1a;https://h…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…

Vulnhub靶机随笔-Hacksudo_Aliens

Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…

计算机网络(网络原理与应用)之高级交换实验------冗余环路与生成树协议

一、实验目的 (1)了解生成树协议的作用&#xff1b; (2)熟悉生成树协议的配置。 二、应用环境 采用生成树协议可以避免环路。 生成树协议的根本目的是将一个存在物理环路的交换网络变成一个没有环路的逻辑树形网络。IEEE802.ID协议通过在交换机上运行一套复杂的算法STA(sp…

[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件&#xff1a; 例如&#xff1a;将home.ui文件转为vio_detect.py文件&#xff0c;所需命令如下&#xff1a; pyuic5 -x home.ui -o vio_detect.py

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 ZooKeeper是一个分…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第二部分&#xff1a;内存 记忆的类型 记忆可以定义为用于获取、存储、保留以及随后检索信息的过程。人脑中有多…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

国内有哪些知名的网络安全厂商?

首先就是360&#xff0c;这个我相信大家并不陌生了吧&#xff0c;你的电脑装过360么&#xff1f; 360在个人终端服务那是妥妥的扛把子&#xff0c;但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服&#xff0c;网络安全的老牌大佬&#xff0c;业务覆盖了全球5…

【网站项目】SpringBoot796水产养殖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…