【2021暑期训练开营测试】8-6 素因子分解
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1K1⋅p2K2⋯pm
输入格式:输入long int范围内的正整数 N。
输出格式:按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki为1即因子pi只有一个时不输出ki。
输入样例:11323
输出样例:11323=3^3*7^2
思路数学模拟题。具体看代码,或者讲解视频
代码123456789101112131415161718192021222324#include<stdio.h>int main() { long long n; scanf("%lld", &n); int first = 0; printf("%lld=", n); for(int i = 2; i <= n / i; i++) { if(n % i == 0) { int num = 0; ...
【2021暑期训练开营测试】8-5 整数集合划分
给定一个包含 N 个正整数的集合,请你将它划分为两个集合 A1 和 A2,其中 A1 包含 n1 个元素,A2 包含 n2 个元素。集合中可以包含相同元素。用 S1 表示集合 A1 内所有元素之和,S2 表示集合 A2 内所有元素之和。请你妥善划分,使得∣n1−n2∣ 尽可能小,并在此基础上∣S1−S2∣ 尽可能大。
2≤N≤105, 保证集合中各元素以及所有元素之和小于 231。
输入格式:第一行包含整数 N。 第二行包含 N 个正整数。
输出格式:在一行中输出 ∣n1−n2∣ 和 ∣S1−S2∣,两数之间空格隔开。
输入样例1:121023 8 10 99 46 2333 46 1 666 555
输出样例1:10 3611
输入样例2:1213110 79 218 69 3721 100 29 135 2 6 13 5188 85
输出样例2:11 9359
思路将一个集合划分为S1和S2两个集合,首先使两集合元素总数的差尽可能小,在此基础上使两集合元素和的差尽可能小
两集合元素总数的差尽可能小,即尽可能趋于0。
原集合的元素总数为偶数,则可S1和S2各分配一半元素;
...
【2021暑期训练开营测试】8-4 统计一行文本的单词个数
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:输入给出一行字符。
输出格式:在一行中输出单词个数。
输入样例:1Let's go to room 209.
输出样例:15
鸣谢用户 张麦麦 补充数据!
思路getline输入字符串,扫描字符串
遇到字母时,若这个字母的前一个字符不是空格,则是一个新单词
代码123456789101112131415161718192021#include <iostream>#include <algorithm>#include <vector>using namespace std;int main() { string str; getline(cin, str); char ch = ' '; //当前位置的前一个字符 int ret = 0; for(int i=0;i<(int)str.size();i++) { char it=st ...
【2021暑期训练开营测试】8-3 数组循环左移
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:128 31 2 3 4 5 6 7 8
输出样例:14 5 6 7 8 1 2 3
思路将数组左移m位,相当于(假设一个数组的索引为1n):先输出(m+1)n,再输出1~m
注意,m可能大于等于n,等于n时,相当于没有变化;大于n时,需要m=m%n
正常法:扫描数组,让m索引后的数,a[i-1]=a[i],左移
混水摸鱼法:不听题目的话,就单独开个数组,先存储进(m+1)n,然后存储进1m。输出这个单独开的数组。
代码混水摸鱼
12345678 ...
【2021暑期训练开营测试】8-7 完美配对1
给定一个长度为 n 的整数序列 a1 , a2 , … , an。我们称一个二元组(i,j)是完美配对的,当且仅当 i<j 并且 ai−aj=j−i.求完美配对的二元组数目.
对于前 3 个测试点
1≤n≤103
对于后两个测试点
1≤n≤105
所有的测试点都满足
1≤ai≤105
输入格式:12na1 a2 ... an
输出格式:输出完美配对的二元组数目
输入样例:1253 2 5 2 6
输出样例:仅有一对二元组(1, 2)满足条件, 因为 3 - 2 = 2 - 1.
11
思路暴力循环会超时
只要两个元素满足ai−aj=j−i,即ai+i=aj+j,元素数+索引数相等即可配对
开数组标记每个元素的元素数+索引数的和,扫描给定数组,每扫描一个数,寻找前面已扫描过的满足ai+i=aj+j的数量即可
代码123456789101112131415161718192021#include <iostream>using namespace std;const int N = 1e6 + 5;int arr[N], num[N];int main() ...
每日分享day01-复杂度分析
2021河北大学暑期程序设计训练每日知识分享-day01
每日分享——复杂度分析在刷算法题时,经常遇到超时或者内存超限的提示,这与算法本身的时间复杂度和空间复杂度有关,其中时间复杂度是评判程序运行效率的重要指标,也是我们重点关注的部分。那么如何进行复杂度分析呢?1.复杂度分析:
数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。因此从执行时间和占用空间两个维度来评估数据结构和算法的性能。
复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有(大 O 复杂度表示法):O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )。
2.复杂度分析法则
单段代码看高频:比如循环。
多段代码取最大(加法法则):比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。
嵌套代码求乘积(乘法法则):比如递归、多重循环等
多个规模求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。
3.常用的复杂度级别
...
【2021天梯赛】考前冲刺例题分享
天梯赛考前冲刺例题分享0、感觉感觉排序输出、字符串处理、数学题这样的题变化很大,使用的方法因题而定,很少固定的套路。这里只写了写那些可以靠固定套路(不怎么需要思考,基本围绕某一个算法)的题,感觉是一类题
1、模拟静态链表链表元素分类
Sharing
2、具体的排序方法快速排序
插入与归并
Insertion or Heap Sort
3、二叉树的遍历建立树的遍历
Tree Traversals Again
4、BST建立Build A Binary Search Tree
Counting Nodes in a BST
5、树的深搜一般都是搜索结点的信息
Deepest Root
Path of Equal Weight
6、AVL和R-BAVL和R-B似乎不是考点,但听说L2和甲级出题大纲一样,甲级都有AVL和R-B了(不过只涉及了基本的了解,而且会在题目中给出定义)
Root of AVL Tree
Is It A Red-Black Tree
7、图的最短路径只是突然想起来,万一考负权边,就要Bellman-Ford了。不过以前从未考过
8、是否完全二叉树的判断Complete ...
【2021天梯赛训练-10】7-8 最短路径之Dijkstra
本题目要求通过读入无向网的边的信息(省略了各顶点的信息,仅用顶点编号来表示),构造图,并利用Dijkstra算法,求出指定源点到其它各点的最短路径。
输入样例:第一行,两个整数,顶点数vN和边数eN。 以后若干行,是相关边的信息,无向图的边是对称的,只输入一半的边(小编号到大编号的,间以空格),最后两行各一个整数,前一个指定源点,后一个指定的查询的终到点。 (注意,示例中34条边,只输入了17条边的信息)
123456789101112131415161718192010 340 1 20 3 51 2 51 3 22 4 82 5 43 5 43 6 24 7 54 5 25 6 35 7 95 8 76 8 77 8 37 9 48 9 808
输出样例:在一行中输出从源点到指定终点的短路径及代价,注意:所有符号均为西文符号。
10-->1-->3-->6-->8:13
思路:
单源最短路径算法,注意源点和终点相同的情况,需要特判输出
代码:12345678910111213141516171819202122232425262728293031323 ...
【2021天梯赛训练-10】7-6 单源最短路径
请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点,编号为0至n-1,以顶点0作为源点。
输入格式:输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过1000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。
输出格式:输出为一行整数,为按顶点编号顺序排列的源点0到各顶点的最短路径长度(不含源点到源点),每个整数后一个空格。如源点到某顶点无最短路径,则不输出该条路径长度。
输入样例:123454 40 1 10 3 11 3 12 0 1
输出样例:11 1
思路:
这里采取的是邻接表存储信息的操作,因为n值较大,设置dis数组存储源点到各个点的最短距离,注意初始化
采用了最普通的Dijkstra算法,每次寻找最小权值,并判断是否可以进行松弛。
最后输出时注意,无最短路径时(即两点间距离为无穷时),不输出对应的dis值
代码:1234567891011121314151617181920212223242526272829303132333435363 ...
【2021天梯赛训练-10】 7-5 敲笨钟
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。
现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。
输入格式:输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
输出格式:对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。
输入样例:1234565xun zhang zhai ju l ...