首页 > 其他分享 >第十五节 数论 - 2

第十五节 数论 - 2

时间:2023-07-27 19:44:53浏览次数:32  
标签:前缀 数论 字母 long int num str 第十五

AT_abc182_d 题解

洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

从数轴的原点开始向正方向走。

第一次向前走 \(a_1\) 步,第二次向前走 \(a_1+a_2\),以此类推。

求走过的最大位置

思路

首先直接模拟时间复杂度 \(O(n^2)\),看一下数据范围 \((1 \le N \le 2 \times 10^5)\) 得知此方法会超时

那么就需要一点优化,用前缀和即可解决此题,没学过前缀和的建议看这个通过前缀和求出前 \(i\) 项的和就很容易解决此题了:

for(int i = 1; i <= n; i ++) {
		cin >> a[i];
		pre[i] = pre[i - 1] + a[i];
	}

预处理前缀和,在预处理的过程中同步求最大值,但因为此题的答案即最大值有可能在过程中产生故需要 \(O(N)\) 遍历前缀和求最大,此时间复杂度可以接受。

经过以上分析和前缀和优化,很容易即可得出代码了:

#include<iostream>
using namespace std;

int n, a[200005];
long long pre[200005], maxn[200005]; // 前缀和数组及最大前缀和数组

int main() {
	cin >> n;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i];
		pre[i] = pre[i - 1] + a[i]; // 预处理前缀和
		maxn[i] = max(maxn[i - 1], pre[i]); // 预处理前缀和最大值
	}
	long long temp, ans = -0x3f3f3f3f; // ans 要求最大值,所以建议赋值一个足够小的负数
	for(int i = 1; i <= n; i ++) {
		ans = max(ans, maxn[i] + temp); // 遍历求最大值
		temp += pre[i]; // 一点点模拟
	}
	cout << ans << endl; // 输出,换行好习惯
	return 0;
}

提交记录

\[\text{The End!} \]

AT_arc113_c 题解

洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

现在有一个字符串 \(S\),每一次你可以选择一个 \(i(1 \le i \le | S |)\),如果 \(S_i = S_{i + 1} \ne S_{i + 2}\)。就可以将 \(S_{i + 2}\) 设为 \(S_i\)

最多能操作几次。

思路

本题比较贪心,让我们先来造一个样例解释一下:

abbfioidddssabsaa 最优的方案是:

  • 先操作 \(4\) 次变为 abbfioidddsssssss

  • 再操作 \(7\) 次变为 abbfioidddddddddd

  • 最后操作 \(14\) 次变为 abbbbbbbbbbbbbbbb

这样最大总操作次数为 \(25\) 次。

从这个样例中可以发现贪心思路,要想总操作次数最大化,就需要从后到前去操作,如果从前到后操作那么后面可操作的连续字母就会被覆盖,这样总操作次数就不是最大了。

对于每次操作,最优的是把后面的所有不相同的字母变为一样,这就涉及到一个问题,如果后面有相同字母如何判断?其实不必再从当前位置往后搜,只需要定义一个 \(num\) 一维数组用 \(num_i\) 表示当前位置的后面字母 \(i\) 的个数

对于 \(num\) 数组需要在搜的过程中处理。如果遇到可以替换的情况就把当前位置后的字母全变为当前字母,同时需清空 \(num\) 数组的记录,把当前位置的字母数记录即可。

替换后,\(ans\) 需增加 \(n - i\),考虑到后面的相同字母,所以就需要用到我们维护的 \(num\) 数组了,所以操作数需减去 \(num_{str_{i}-'a'}\)。

经过以上分析及优化后,很容易即可写出代码了:

#include<iostream>
using namespace std;

string str;
long long ans = 0, num[205];

int main() {
	cin >> str;
	int n = str.length(); // 记录 str 的长度
	num[str[n - 1] - 'a'] ++, num[str[n - 2] - 'a'] ++; // 初始化 num 数组
	for(int i = n - 3; i >= 0; i --) {
		num[str[i] - 'a'] ++; // 记录此位置的字母
   		// 满足替换的条件
		if(str[i + 1] != str[i + 2] && str[i] == str[i + 1]) {
			ans += n - i - num[str[i] - 'a'];
			for(int j = 0; j < 26; j ++) num[j] = 0; // 清空 num 数组
			num[str[i] - 'a'] = n - i; // 记录替换后的字母数
		}
	}
	cout << ans << endl; // 输出,换行好习惯
	return 0;
}

提交记录

\[\text{The End!} \]

标签:前缀,数论,字母,long,int,num,str,第十五
From: https://www.cnblogs.com/So-noSlack/p/17585860.html

相关文章

  • 第十五节 数论 - 2
    AT_agc017_b题解洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输......
  • 第十四节 数论
    $$\text{建议阅读}$$A.优美子数列题目描述数学家小\(Q\)得到了一个长度为\(n\)的数列{\(a_n\)}。小\(Q\)的幸运数字是\(k\),所以他认为,若一个子数列\(a_l\),\(a_l+1\),…,\(a_r\)的和为\(k\)的倍数,则该子数列是优美子数列。小\(Q\)现在想考考你,{\(a_n\)}......
  • (Relax 数论1.26)POJ 1496 Word Index(计算一个字符串在字典中的位置)
    大致题意:(与POJ1850基本一致)输出某个str字符串在字典中的位置,由于字典是从a=1开始的,因此str的位置值就是在str前面所有字符串的个数+1规定输入的字符串必须是升序排列。不降序列是非法字符串要求用循环输入,输入若干组字符串,若输入非法字符串则输出0,但不结束程序,这是和POJ1850......
  • 基础数论
    Updon2023.1.12添加了整除分块和莫比乌斯反演。Updon2023.7.22重新排版,添加、删去了一些内容,修改了一些晦涩难懂的描述,开放阅读。$$\huge\textbf{0x01}\\large\textbf{数论入门}$$"质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。""合数是指在大......
  • PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法
    一:背景1.讲故事在dump分析旅程中,经常会遇到很多朋友反馈一类问题,比如:方法平时都执行的特别快,但有时候会特别慢,怎么排查?我的方法第一次执行特别慢,能看到慢在哪里吗?相信有朋友肯定说,加些日志不就好了,大方向肯定是没问题的,但加日志的颗粒度会比较粗而且侵入性也比较大,比如......
  • 第十五篇 - Vue添加图标
    参考链接:https://www.yii666.com/blog/45780.html添加图标的两种方式:1.直接使用element-plus/icons-vue(图标名称网址:https://element-plus.gitee.io/en-US/component/icon.html#icon-collection)2.使用svg-sprite-loader自己下载svg图标(SVG图标下载网址:https://www.iconfinder......
  • 数论板子
    exgcd点击查看代码__int128exgcd(__int128as,__int128bs,__int128&x,__int128&y){if(bs==0){x=1;y=0;returnas;}__int128ans=exgcd(bs,as%bs,y,x);y-=(as/bs)*x;returnans;}a&c&lucas点击查看代码......
  • 数论分块
    概念我们考虑这样一个问题:求\(\sum_{i=1}^{k}\lfloor\dfrac{n}{i}\rfloor\)我们以\(n=7,k=7\)为例子,先画出\(f(x)=\dfrac{7}{x}\(1\leqx\leq7)\)的图像因为我们的取值是向下取整的,我们描出所有可能的取值注意到所有的点按照取值可以分成若干段我们可以一次......
  • 20230710-20230711 数论
    数论被薄纱了/kk授课老师:南京大学-朱富海教授20230710裴蜀定理对于给定不全为零的整数的\(a,b\)一定存在一对整数\(x,y\)满足\(ax+by=gcd(a,b)\)。证明:\(a==0\)\(or\)\(b==0\)显然成立;设\(gcd(a,b)=d\),即求证存在\(x,y\)满足\(ax+by=d\),等式两边同时除......
  • 数论专题练习
    数论专题练习A-BeautifulNumbers题意:输入a,b,n,求只包含a,b的n位数并且n位之和为a或b的数量枚举a和b的数量,判断它们的和是否为一个good_number,然后用组合数(详见数论的组合数)求和#include<bits/stdc++.h>usingnamespacestd;constintp=1e9+7;constintMAXN=1e6......