青少年编程知识记录 codecoming

【题解】循环比赛日程表

【题目描述】

设有N个选手进行循环比赛,其中 N=2^M ,要求每名选手要与其他的N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。

【输入描述】

输入M

【输出描述】

一个二维数组,表示比赛安排表,一行数据间用一个空格隔开。

【样例输入】

3

【样例输出】

1 2 3 4 5 6 7 8  2 1 4 3 6 5 8 7  3 4 1 2 7 8 5 6  4 3 2 1 8 7 6 5  5 6 7 8 1 2 3 4  6 5 8 7 2 1 4 3  7 8 5 6 3 4 1 2  8 7 6 5 4 3 2 1

标签: 分治

作者:亿万年的星光 分类:题解目录 浏览:

【算法】归并排序

一、基本思想

归并排序的核心思想是将两个已经有序的子序列合并成一个有序序列。整个过程分为两个主要步骤:



 1.分解:将待排序的序列不断二分,直到每个子序列只包含一个元素(此时自然有序) 

 2.合并:将两个有序的子序列合并为一个有序序列



注意1:若将两个有序表合并成一个有序表,称为2-路归并。

注意2:归并排序则类似于二叉树的后序遍历:它会持续划分区间,直到区间内元素有序,然后利用额外空间对元素进行排序,并将它们合并回原区间,直至整个序列有序。这个过程中,划分区间相当于达到树的最底层,而归并排序则相当于从树的底层开始向上遍历。

二、算法步骤

1.分解阶段:

  • 将长度为n的序列分成两个长度为n/2的子序列

  • 递归地对这两个子序列进行归并排序

  • 直到子序列长度为1(此时已经有序)

2.合并阶段:

  • 申请空间,大小为两个已排序子序列之和

  • 设定两个指针,分别指向两个子序列的起始位置

  • 比较两个指针所指的元素,选择较小的放入合并空间,并移动指针到下一位置

  • 重复上一步直到某一指针超出子序列范围

  • 将另一子序列的剩余元素直接复制到合并序列的末尾





动图如下:



三、时间复杂度

  • 最优情况:O(n log n)

  • 最坏情况:O(n log n)

  • 平均情况:O(n log n)

归并排序的时间复杂度始终是O(n log n),因为它总是将序列分成两半,需要进行log₂n次分解,每次合并操作的时间复杂度为O(n)。



四、空间复杂度

归并排序需要额外的空间来存储临时合并的数组,因此其空间复杂度为O(n)。



五、稳定性

归并排序是稳定的排序算法,因为在合并过程中,当两个元素相等时,可以保证左边的元素先被放入结果数组中。





六、优缺点



优点:



  • 时间复杂度稳定为O(n log n)

  • 适用于大规模数据排序

  • 稳定排序算法



缺点:



  • 需要额外的存储空间(非原地排序)

  • 对于小规模数据排序效率可能不如简单排序算法



作者:亿万年的星光 分类:算法 浏览:

【题解】智力大冲浪

【题目描述】

小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则:

首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱 wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!

注意:比赛绝对不会让参赛者赔钱!

【输入描述】

第一行为 m,表示一开始奖励给每位参赛者的钱;第二行为n,表示有n个小游戏;

第三行有n个数,分别表示游戏1~n的规定完成期限;第四行有n个数,分别表示游戏1~n不能在规定期限前完成的扣款数

【输出描述】

仅1行。表示小伟能赢取最多的钱,

【样例输入】

10000  7  4 2 4 3 1 4 6  70 60 50 40 30 20 10

【样例输出】

9950
作者:亿万年的星光 分类:题解目录 浏览:

【题解】线段

【题目描述】

在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?

【输入描述】

第一行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。

【输出描述】

输出文件仅包括1个整数,为k的最大值。

【样例输入】

3  0 2  2 4  1 3

【样例输出】

2
作者:亿万年的星光 分类:题解目录 浏览:

【题解】同学的等待

【题目描述】

同学们下课后去食堂,每个人都需要一段时间去点菜。

然而,某些同学点菜时间太长了。同学们对于等待很烦躁:他们希望,能尽量少的花时间等待。

(同学数<=100000),(0<=点菜耗时<=10000)

他们希望在点菜时,能排成一个次序,使得总等待时间最短(即不包括点菜人的其他所有人的等待时间)。

【输入描述】

第一行是一个数字n,表示同学的个数

接下来n个数,表示点菜的耗时

【输出描述】

一个数,表示总等待时间。

【样例输入】

6  9 1 3 5 4 2

【样例输出】

35



作者:亿万年的星光 分类:题解目录 浏览:

【题解】增添战斗力

【题目描述】

大战即将来临,杰洛特需要为自己增添战斗力,广袤的大陆有诸多豪杰,正好可以为杰洛特所用

    杰洛特分别有两处地方n1,n2需要豪杰的战斗力

    一共有n个豪杰,每一个豪杰拥有自己的战斗力pi,当然战斗力是越高越好,可是人人之间还是有差距的。

    因此两个城池决定,各自选出最高战斗力的算术平均值之和。

【输入描述】

第一组一个n表示拥有多少个豪杰,以及一个n1,n2分别表示城池需要的豪杰数

    接下来一行有n个数据分别表示各个豪杰的战斗力

【输出描述】

两个城池最大的战斗力算数平均值之和(结果保留6位小数)

【样例输入】

4 1 2  1 2 3 4

【样例输出】

6.500000



作者:亿万年的星光 分类:题解目录 浏览:

【题解】最多次数

【题目描述】

小蓝有一个字符串 s,他特别喜欢由以下三个字符组成的单词:l,q,b,任意顺序都可以,一共有 6 种可能:lqb、lbq、qlb、qbl、blq、bql。

现在他想从 s 中,尽可能切割出多个他喜欢的单词,请问最多能切割出多少个?单词指的是由若干个连续的字符组成的子字符串。

【输入描述】

输入一行包含一个字符串 s。

【输出描述】

输出一行包含一个整数表示答案。

【样例输入】

lqbblqblqlxqb

【样例输出】

3

【数据范围】

对于20%的数据,1<=|s|<=10

对于40%的数据,1<=|s|<=20

对于60%的数据,1<=|s|<=100

对于70%的数据,1<=|s|<=1000

对于80%的数据,1<=|s|<=10000

对于所有数据,1<=|s|<=10^5, s中只包含小写字母

作者:亿万年的星光 分类:题解目录 浏览:

【题解】变换数组

【题目描述】

输入一个数组 a,包含有 n 个元素 a1,a2,⋯,an。对这个数组进行 m 次变换,每次变换会将数组 a 中的每个元素 ai 转换为 ai⋅bitCount(ai)。其中 bitCount(x) 表示数字 x 的二进制表示中 1 出现的次数,例如 bitCount(3)=2,因为 3 的二进制表示为 11,其中 1 出现了两次。

请输出变换之后的数组内容。

【输入描述】

输入的第一行包含一个正整数 n,表示数组 a 中的元素个数。

第二行包含 n 个整数 a1,a2,⋯,an,相邻整数之间使用一个空格分隔。

第三行包含一个整数 m,表示变换次数。

【输出描述】

输出一行,包含 n 个整数,相邻整数之间使用一个空格分隔,表示变换之后得到的数组 a。

【样例输入】

2  5 7  2

【样例输出】

20 63

【样例说明】

  • ,第一次变化后 

  • ,第二次变换后 

【数据范围】

对于30%的数据,1<=n<10

对于60%的数据,1<=n<=100

对于100%的数据,1<=n<=100, 0<=m<=5,0<=ai<=1000

作者:亿万年的星光 分类:题解目录 浏览:

【题解】最短距离

【题目描述】

在一条一维的直线上,存在着 n 台显示器和 n 个电源插座。老师给小蓝布置了个任务:负责将每台显示器通过电源线与一个插座相连接(每个插座最多只能给一台显示器供电);同时,老师希望所消耗的电源线的长度尽可能的少,请你帮小蓝计算下电源线的最小消耗长度为多少?

为了便于计算,你只需要考虑直线距离即可。

【输入描述】

输入的第一行包含一个正整数 n。

接下来 n 行,每行包含一个整数 xi,依次表示每台显示器的坐标。

接下来 n 行,每行包含一个整数 yi,依次表示每个插座的坐标。

【输出描述】

输出一行包含一个整数表示答案。

【样例输入】

2  0  1  2  3

【样例输出】

4

【数据约定】

对于20%的数据,1<=n<=10,  0<=Xi,Yi<=100

对于40%的数据,1<=n<=100, 0<=Xi,Yi<=10^3

对于60%的数据,1<=n<=1000, 0<=Xi,Yi<=10^5

对于80%的数据,1<=n<=10000,0<=Xi,Yi<=10^9

对于所有数据,1<=n<=50000,0<=Xi,Yi<=10^9

【题解】母舰

【题目描述】

在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负。一艘母舰的攻击力是普通的MA(Mobile  Armor)无法比较的。 对于一艘母舰而言,它是由若干个攻击系统和若干个防御系统组成的。两艘母舰对决时,一艘母舰会选择用不同的攻击系统去攻击对面母舰的防御系统。当这个攻击系统的攻击力大于防御系统的防御力时,那个防御系统会被破坏掉。当一艘母舰的防御系统全部被破坏掉之后,所有的攻击都会攻击到敌方母舰本身上去造成伤害。 这样说,一艘母舰对对面的伤害在一定程度上是取决于选择的攻击对象的。 在瞬息万变的战场中,选择一个最优的攻击对象是非常重要的。所以需要写出一个战斗系统出来,判断出你的母舰最多能对对手造成多少伤害并加以实现。

【输入描述】

输入第一行两个整数M和N,表示对方母舰的防御系统数量和你的母舰的攻击系统数量。 接着M行每行一个整数每一个表示对方防御系统的防御力是多少。 接着N行每行一个整数每一个表示己方攻击系统的攻击力是多少。

【输出描述】

输出仅有一行,表示可以造成的最大伤害。

【样例输入】

3 5  1000  2000  1200  2100  2000  1200  1000  1000

【样例输出】

2000
作者:亿万年的星光 分类:题解目录 浏览: