ABC353 A-E题解

ABC353 A-E题解

  • A
    • 题目
    • AC Code(CPP)
    • AC Code(Python)
  • B
    • 题目
    • AC Code(CPP)
    • AC Code(Python)
  • C
    • 题目
    • AC Code(CPP)
    • AC Code(Python)
  • D
    • 题目
    • AC Code(CPP)
    • AC Code(Python)
  • E
    • 题目
    • AC Code(CPP)
    • AC Code(Python)

下面的内容不包括题目翻译,要想获取题目翻译,请参照 这篇教程 来获取题目翻译。

A

题目

从左到右遍历数组,找到第一个比数组第一个元素大的元素,输出坐标即可。如果没有输出 -1 即可。

AC Code(CPP)

#include <bits/stdc++.h>
using namespace std;
int n, h[200100];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> h[i];if (h[i] > h[1]) {cout << i << '\n';return 0;}}cout << -1;return 0;
}

AC Code(Python)

n = int(input())
a = [int(i) for i in input().split()]
flag = 0for i in range(len(a)):if a[i] > a[0]:print(i + 1)flag = 1break
print(("-1", "")[flag])

B

题目

就是个模拟,按照题目所给信息编码即可。

AC Code(CPP)

#include <bits/stdc++.h>
using namespace std;
int n, k, a[200100];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}int cnt = 1, tmp = 0;for (int i = 1; i <= n; i++) {if (a[i] <= k - tmp) {tmp += a[i];}else {tmp = a[i];cnt++;}}cout << cnt;return 0;
}

AC Code(Python)

n, k = [int(i)for i in input().split()]
a = [int(i)for i in input().split()]
cnt = 0
Sum = 0
for i in a:if Sum + i > k:Sum = 0cnt += 1Sum += i
print(cnt + 1)

C

题目

可以发现,无论数组如何排序,每一个 A i A_i Ai 都在一个 形如 ( A x , A y ) (A_x,A_y) (Ax,Ay) 的对中,所以数组的顺序并不重要。

因为所有 A i ≤ 1 0 8 A_i\le 10^8 Ai108,所以 A i + A j A_i + A_j Ai+Aj 除以 1 0 8 10^8 108 的余数要么是 A i + A j − 1 0 8 ( A i + A j > 1 0 8 ) A_i+A_j - 10^8(A_i+A_j>10^8) Ai+Aj108(Ai+Aj>108),要么是 A i + A j ( A i + A j < 1 0 8 ) A_i + A_j(A_i+A_j < 10^8) Ai+Aj(Ai+Aj<108)

可以将数组排序,发现对于每一个 A i A_i Ai,如果 A i + A j > 1 0 8 A_i+A_j>10^8 Ai+Aj>108,那么 A i + A j + 1 A_i+A_{j+1} Ai+Aj+1 定然大于 1 0 8 10^8 108。发现满足单调性,可以二分,然后用前缀和求出后面所有的和,超过 1 0 8 10^8 108 的段减去相应个数的 1 0 8 10^8 108,在知道分界线坐标后,上述所有操作都可以在 O ( 1 ) O(1) O(1) 的时间复杂度内求出,加上二分和排序的时间复杂度就是 O ( N log ⁡ 2 N ) O(N\log_2N) O(Nlog2N),十分优秀。

此题使用 Python 实现的代码耗时 1293ms,隔壁 C++ 只用了 43ms,30倍的时间差距不容小觑。在用 Python 实现代码是一定要注意常数问题,因为这个语言本来就慢。

AC Code(CPP)

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, a[300100];
int sum[300100], ans;signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) {sum[i] = sum[i - 1] + a[i];}a[n + 1] = 100000001;for (int i = 1; i < n; i++) {int bas = 100000000 - a[i];int l = lower_bound(a + i + 1, a + n + 1, bas) - a - 1;ans += sum[n] - sum[i] - (n - l) * 100000000 + a[i] * (n - i);}cout << ans << '\n';return 0;
}

AC Code(Python)

n = int(input())
a = [int(i) for i in input().split()]
a.sort()
Sum = [a[0]]for i in range(1, n):Sum.append(a[i] + Sum[i - 1])
# 由于 python 中从 0 开始的下标,所以实现起来会相较于 c++ 来说会有点不同。
ans = 0
for i in range(n - 1):bas = 100000000 - a[i]# 这里相较于 c++ 来说是手写的二分,而不是用 lower_bound 。l, r = i + 1, nwhile l < r:mid = (l + r) // 2if a[mid] >= bas:r = midelse:l = mid + 1ans += Sum[n - 1] - Sum[i] + a[i] * (n - 1 - i)if l < n:ans -= (n - l) * 100000000
print(ans)

D

题目

此题将 f ( x , y ) f(x, y) f(x,y) 转换为纯数学运算可以更好地寻找规律。

我们发现, f ( 11451 , 41919810 ) f(11451, 41919810) f(11451,41919810) 等于这个:

1145141919810 1145141919810 1145141919810

等于

11451 × 100000000 + 41919810 11451 \times 100000000 +41919810 11451×100000000+41919810

所以将其转换成数学运算表达方式等于这个:

f ( x , y ) = x ⋅ 1 0 ⌊ l o g 10 y ⌋ + y f(x,y)=x \cdot 10^{\lfloor log_{10}^y \rfloor} + y f(x,y)=x10log10y+y

仿佛一个一个计算特别麻烦,但是我们可以将数组分成 10 10 10 个集合,每一个集合为 S i S_i Si,对应 A A A i i i 位数的下标。那么可以如此计算:

∑ i = 1 N ∑ j = 1 10 ∑ k ∈ S j f ( A i , A k ) [ k > i ] \sum_{i=1}^N\sum_{j=1}^{10}\sum_{k\in S_j} f(A_i, A_k)[k>i] i=1Nj=110kSjf(Ai,Ak)[k>i]

此时,第三个循环中 A k A_k Ak 可以用前缀和预处理出来,又由于 A i A_i Ai 的系数固定,可以 O ( 1 ) O(1) O(1) 处理出来。

此时时间复杂度就变成了 O ( 10 n ) O(10n) O(10n),十分优秀。

注意 C++ 中取模问题,代码中我使用了后缀和,更方便,但是前缀和与后缀和没什么区别。请再次注意 python 的运行常数,本题我给的 python 代码运行时间 1600ms,c++ 代码运行时间 40ms,是 python 1 40 \frac1{40} 401

AC Code(CPP)

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, a[200100];
int sum[15][200100], cnt[15][200100];
int p10[20], ans;
int f(int x) {return floor(log10(x)) + 1;
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = n; i >= 1; i--) {for (int j = 1; j <= 11; j++) {sum[j][i] = sum[j][i + 1];cnt[j][i] = cnt[j][i + 1];}sum[f(a[i])][i] += a[i], cnt[f(a[i])][i] += 1;sum[f(a[i])][i] %= 998244353ll;}p10[0] = 1;for (int i = 1; i <= 11; i++) {p10[i] = p10[i - 1] * 10;p10[i] %= 998244353ll;}for (int i = 1; i < n; i++) {for (int j = 1; j <= 11; j++) {ans += (sum[j][i + 1] + (a[i] % 998244353ll) * cnt[j][i + 1] %998244353ll * p10[j] % 998244353ll) % 998244353ll;ans %= 998244353ll;}}cout << ans % 998244353ll;return 0;
}

AC Code(Python)

from math import *n = int(input())
a = [int(i) for i in input().split()]def f(x):return floor(log10(x)) + 1p10 = [1]
for i in range(12):p10.append(p10[i] * 10)
Sum, cnt = [], []
for i in range(n + 2):Sum.append([0] * 12)cnt.append([0] * 12)for i in range(n - 1, -1, -1):for j in range(0, 12):Sum[i][j] = Sum[i + 1][j]cnt[i][j] = cnt[i + 1][j]Sum[i][f(a[i])] += a[i]cnt[i][f(a[i])] += 1ans = 0
for i in range(n - 1):for j in range(1, 12):ans += p10[j] * a[i] * cnt[i + 1][j] + Sum[i + 1][j]ans %= 998244353print(ans)

E

题目

考虑暴力:

先枚举 i , j i,j i,j,再暴力寻找最长前缀,其时间复杂度可以被卡到 O ( N 2 ) O(N^2) O(N2) 以上。

考虑优化:

我们发现,对于每一个字符串,暴力查找时前面共同前缀部分被重复计算了很多次,我们尅确定每一个 i i i,再遍历字符串,再遍历数组,一旦发现有一个串已经枚举过了公共前缀的最后一个字符,加上答案,不管这个字符串了,这样时间复杂度可以被优化一部分,但是最大值仍然是 O ( N ∑ i = 1 n ∣ S i ∣ ) O(N\sum_{i=1}^n|S_i|) O(Ni=1nSi) 的,不可取。

我们发现,由于公共前缀都在当前字符串上,所以寻找公共前缀部分可以用字典树(也称 trie 树)实现,对于每一个节点,统计当前位置是这个节点表示的字符的个数(表示为 cnt),我们遍历字符串,遍历的答案加上该节点的 cnt,最后返回遍历的答案即可。

由于走到某节点的所有字符串该节点前的前缀都一样,所以字典树是永远正确的。

AC Code(CPP)

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
string s[300100];
bool operator <(string a, string b) {return a.size() < b.size();
}
struct node{int p, nxt[30], cnt;
};
node t[4000100];
int cnt = 0;
void add(string s) {int p = 0;for (int i = 0; i < (int)s.size(); i++) {if (!t[p].nxt[s[i] - 'a']) {t[p].nxt[s[i] - 'a'] = ++cnt;}p = t[p].nxt[s[i] - 'a'];t[p].cnt++;}
}
int calc(string s) {int p = 0;int ret = 0;for (int i = 0; i < (int)s.size(); i++) {ret += t[p].cnt;p = t[p].nxt[s[i] - 'a'];}ret += t[p].cnt;return ret;
}
int ans;
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> s[i];add(s[i]);}for (int i = 1; i <= n; i++) {ans += calc(s[i]) - (int)s[i].size();}cout << ans / 2;return 0;
}

AC Code(Python)

n = int(input())
a = [str(i) for i in input().split()]
cnt, Next = [], []def add_node():cnt.append(0)temp = []for i in range(30):temp.append(0)Next.append(temp)def insert(s):p = 0for i in s:now_char = ord(i) - 97if Next[p][now_char] == 0:add_node()Next[p][now_char] = len(cnt) - 1p = Next[p][now_char]cnt[p] += 1def calc(s):p, ret = 0, 0for i in range(len(s)):now_char = ord(s[i]) - 97p = Next[p][now_char]ret += cnt[p]return ret - len(s)add_node()
for i in range(n):insert(a[i])
ans = 0
for i in range(n):ans += calc(a[i])
print(ans // 2)

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

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

相关文章

机器学习 - 集成学习算法介绍

集成学习的定义 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个模型来提升预测性能的技术。简单来说&#xff0c;它就像是在开会时听取多人的意见&#xff0c;而不是只依赖一个人的观点&#xff0c;从而做出更准确的决策。 1. Bagging&#xff08;Boo…

java数据结构与算法(相交链表)

前言 要判断两个链表是否相交&#xff0c;可以使用双指针法。假设链表A的长度为m&#xff0c;链表B的长度为n&#xff0c;首先遍历链表A和链表B&#xff0c;分别得到它们的长度。然后&#xff0c;让较长的链表的指针先移动|m - n|步&#xff0c;使得两个链表剩下的长度相等。接…

SL3038 48V/60V电动车里程增程器电源驱动芯片 大电流3A

在电动车领域中&#xff0c;电池续航能力一直是制约其广泛应用的关键因素之一。为了提高电动车的续航能力和使用效率&#xff0c;各大厂商纷纷投入研发&#xff0c;寻求更为先进的电源驱动芯片解决方案。其中&#xff0c;SL3038 48V/60V电动车里程增程器电源驱动芯片以其卓越的…

【Java基础】权限修饰符

一个java文件中只能有一个被public修饰的类&#xff0c;且该类名与java文件的名字一样 同一个类同一个包不同包有继承不同包无继承private✔❌❌❌默认✔✔❌❌protected✔✔✔❌public✔✔✔✔

产品经理资料包干货

1.《产品汪》免费电子书 2016年我面试了差不多有200多位产品求职者&#xff0c;其中不乏之前做厨师编剧这些岗位的人。在这个过程中我意识到大众或许对产品经理这个岗位存在一些认知和理解上的误差&#xff0c;于是我就想着写一本产品经理相关的书。 关于本书的更多信息可查看…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

windows无法启动硬件设备,代码(19)解决办法

遇到一台电脑&#xff0c;摄像头无法使用&#xff0c;查看设备管理器看到设备名前出现感叹号&#xff0c;双击打开看到“由于其配置信息&#xff08;注册表中的&#xff09;不完整或已损坏&#xff0c;windows无法启动硬件设备&#xff0c;代码&#xff08;19&#xff09;”错误…

蓝桥杯备战23.合根植物——并查集

题目链接 P8654 [蓝桥杯 2017 国 C] 合根植物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) AC代码 #include<bits/stdc.h> using namespace std; #define int long long const int N 2e610,M1e310; int a[N],pre[N],p[N],ans0; int find(int x) {if(p[x]!x){p[x]f…

在js中table表格中进行渲染轮播图

效果图&#xff1a;示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><script src"js/jquery-3.6.3.js"></script><style>/* 轮播图 */.basko {width: 100%;h…

优化Mac系统,TinkerTool一键掌控!

TinkerTool System for Mac是一款专为Mac用户设计的系统设置维护工具。这款软件不仅具备执行系统维护任务的能力&#xff0c;如管理文件和调整系统或用户设置&#xff0c;还包含一系列功能强大的工具&#xff0c;旨在帮助用户解决、修复、排除故障或修复系统错误和损坏的帐户等…

【ARM 嵌入式 C 文件操作系列 20.3 -- 二进制文件转为16进制数组】

请阅读【嵌入式开发学习必备专栏】 文章目录 binary to hexC code测试效果Makefile 编译 binary to hex 在嵌入式开发的过程中经常遇到需要将二进制文件转换为十六进制数组的需求&#xff0c;比如需要将某个镜像文件转换为数组&#xff0c;然后通过写memory的方式将镜像文件加…

华为涅槃,余承东重生

最近一段时间&#xff0c;余承东甚为低调。最为明显的是&#xff0c;“遥遥领先”已经听不到了&#xff0c;“余大嘴”口中的措辞越来越克制。 今后手机相关的发布会&#xff0c;或许不再看到余承东的身影。 5月10日&#xff0c;余承东的职位正式更新&#xff0c;从终端BG CE…

Linux/ubuntu build编译make时出现has modification time int the future的问题解决方法

针对Linux由于双系统之间的时间冲突导致linux时间经常变化&#xff0c;出现执行make命令时出现“make[2]: Warning: File xxx.c’ has modification time 1.6e05 s in the future “警告的问题&#xff0c;亦或者虚拟机出现相同的问题。 由于时钟同步问题&#xff0c;出现 warn…

菲律宾签证照片尺寸要求,用手机生成

菲律宾签证照片尺寸要求如下图所示&#xff0c;可以用手机在微信搜索随时照小程序&#xff0c;快速生成哦。

【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手

文章目录 一、前言二、绘制效果三、ConstraintLayout 使用方法3.1 创建布局文件3.2 替换配置3.3 设置约束&#xff0c;步骤13.4 设置约束&#xff0c;步骤23.5 其他设置 四、结束 一、前言 在进行Android APP开发过程中&#xff0c;减少layout嵌套即可改善UI的绘制性能&#x…

vue 百度地图点击marker修改marker图片,其他marker图片不变。

解决思路&#xff0c;就是直接替换对应marker的图片。获取marker对象判断点击的marker替换成新图片&#xff0c;上一个被点击的就替换成老图片。 marker.name tag;marker.id i; //一定要设置id&#xff0c;我这里是设置的循环key值&#xff0c;要唯一性。map.addOverlay(mark…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中&#xff0c;调试事件&#xff08;Debug Event&#xff09;是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生&#xff1a; 进…

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳&#xff08;CO2&#xff09;等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想&#xff0c;由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想&#xff0c;可分为3…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标&#xff1a;&#xff08;1&#xff09;创建5个执行器&#xff1a;蜂鸣器&#xff0c;LED1&#xff0c;LED2&#xff0c;ED3&#xff0c;LED4;&#xff08;2&#xff09;执行器能对…

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…