青少年编程知识记录 codecoming

【题解】前缀最小值

【题目描述】

求一个数列的所有前缀最小值之和。

即:给出长度为n的数列a[i],求出对于所有1<=i<=n,min(a[1],a[2],...,a[i])的和。

由于读入较大,数列由随机种子生成。

其中a[1]=x,a[i]=(379*a[i-1]+131)%997。

【输入描述】

一行两个正整数n,x,分别表示数列的长度和随机种子。(n<=100000,x<997)

【输出描述】

一行一个正整数表示该数列的前缀最小值之和。

【样例输入】

5 666

【样例输出】

1650

【提示】

数列为{666,304,692,188,596},前缀最小值为{666,304,304,188,188},和为1650。



前缀最小:

比如,有数列:666 304 692 188 596,前缀最大值为:666,304,304,188,188,和为1650。

对于每个位置的前缀最小值解释如下:对于第1个数666,只有一个数,一定最大;对于第2个数,求出前两个数的最小数,还是304;对于第3个数,求出前3个数的最小数是304……其余位置依次类推,最后求前缀最小值得和。



标签: 动态规划

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

2020CSPJ-直播获奖

【题目描述】

NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线。

更具体地,若当前已评出了p 个选手的成绩,则当前计划获奖人数为 

max(1,pw%),其中 w 是获奖百分比,x 表示对x 向下取整,max(x,y) 表示 x 和y 中较大的数。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。

作为评测组的技术人员,请你帮 CCF 写一个直播程序。

【输入描述】

第一行有两个整数 n,w。分别代表选手总数与获奖率。

第二行有 n 个整数,依次代表逐一评出的选手成绩。

【输出描述】

只有一行,包含 n 个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。相邻两个整数间用一个空格分隔。

【样例输入】

10 60  200 300 400 500 600 600 0 300 200 100

【样例输出】

200 300 400 400 400 500 400 400 300 300

【提示】

样例 1 解释:

已评测选手人数12345678910
计划获奖人数1112334456
已评测选手的分

数从高到低排列

(其中,分数线

粗体标出)
200300

200
400

300

200
500

400

300

200
600

500

400

300

200
600

600

500

400

300

200
600

600

500

400

300

200

0
600

600

500

400

300

300

200

0
600

600

500

400

300

300

200

200

0
600

600

500

400

300

300

200

200

100

0



注意,在第9名选手的成绩评出之后,计划获奖人数为5人,但由于有并列,实际会有6人获奖。

输入样例2:

10 30  100 100 600 100 100 100 100 100 100 100

输出样例2:

100 100 600 600 600 600 100 100 100 100

【数据规模与约定】:

各测试点的n 如下表:

测试点编号n=
1∼310
4∼6500
7∼102000
11∼1710^4
18∼2010^5



对于所有测试点,每个选手的成绩均为不超过600 的非负整数,获奖百分比w 是一个正整数且 1≤w99

【提示】

在计算计划获奖人数时,如用浮点类型的变量(如 C/C++ 中的 float 、 double,Pascal 中的 real 、 double 、 extended 等)存储获奖比例w%,则计算5×60% 时的结果可能为3.000001,也可能为 2.999999,向下取整后的结果不确定。因此,建议仅使用整型变量,以计算出准确值。







【题目分析】

  • 排序题,最简单的思路是每次新加一个人,然后就sort一遍,但是这样做肯定会超时的(n=100000)。

  • 其实,从题目中给的测试数据可以发现,每个选手的成绩并不大,不超过600。那么比较好的做法就是用桶排了。



标签: cspj

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

【题解】BFS—迷宫问题(1)

【题目描述】

一个5*5的矩阵,矩阵内用0,1显示。其中,0是路,表示这个点可以走,1是墙表示这个点不可以走。

问,从给定的矩阵中从左上角到右下角最少需要走多少步?

注:题目保证有解(不存在左上角和右下角为1的情况)

【输入描述】

一个5*5的矩阵

【输出描述】

一行,表示最少要走多少步?

【样例输入】

0 1 0 0 0  0 1 0 1 0  0 0 0 0 0  0 1 1 1 0  0 0 0 1 0

【样例输出】

8

标签: bfs最短路径

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

【题解】BFS、DFS——走迷宫问题

【题目描述】

给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。

数据保证 (1,1)处和 (n,m)处的数字为 0,且一定至少存在一条通路

【输入描述】

第一行包含两个整数 n 和 m。

接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

【输出描述】

输出一个整数,表示从左上角移动至右下角的最少移动次数。

【样例输入】

5 5  0 1 0 0 0  0 1 0 1 0  0 0 0 0 0  0 1 1 1 0  0 0 0 1 0

【样例输出】

8

【数据范围】

1≤n,m≤100

标签: BFS

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

【题解】求逆序对个数

【题目描述】

有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<10000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。

例如,5 2 4 6 2 3 2 6,可以组成的逆序对有

(5 2),(5 4),(5 2),(5 3),(5 2),

(4 2),(4 3),(4 2),

(6 2),(6 3),(6 2),

(3 2)

共:12个

【输入描述】

共两行,第一行有一个正整数n,第二行有n个整数。

【输出描述】

只有一行为逆序对个数。

【样例输入】

8  5 2 4 6 2 3 2 6

【样例输出】

12

标签: 分治法

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

【题解】光荣的梦想

【题目描述】

Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求助于你,帮助他完成这个梦想。

一串数列即表示一个世界的状态。

平衡是指这串数列以升序排列。而从一串无序数列到有序数列需要通过交换数列中的元素来实现。KB的能量只能交换相邻两个数字。他想知道他最少需要交换几次就能使数列有序。

【输入描述】

第一行为数列中数的个数n,第二行为n ≤ 10000个数。表示当前数列的状态。

【输出描述】

输出一个整数,表示最少需要交换几次能达到平衡状态。

【样例输入】

4  2 1 4 3

【样例输出】

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

【题解】黑白棋子移动

【题目描述】

有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:○○○○○●●●●●

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。

如n=5时,成为:○●○●○●○●○●

任务:编程打印出移动过程。

【输入描述】

输入n。

【输出描述】



移动过程。

【样例输入】

7

【样例输出】

step 0:ooooooo*******--  step 1:oooooo--******o*  step 2:oooooo******--o*  step 3:ooooo--*****o*o*  step 4:ooooo*****--o*o*  step 5:oooo--****o*o*o*  step 6:oooo****--o*o*o*  step 7:ooo--***o*o*o*o*  step 8:ooo*o**--*o*o*o*  step 9:o--*o**oo*o*o*o*  step10:o*o*o*--o*o*o*o*  step11:--o*o*o*o*o*o*o*
作者:亿万年的星光 分类:题解目录 浏览:

【题解】循环比赛日程表

【题目描述】

设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他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

标签: 分治

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

【题解】字符串

【题目描述】Kri 非常喜欢字符串,所以他准备找 t组字符串研究。 第 i次研究中, Kri 准备了两个字符串S 和R ,其中S 长度为n ,且只由  0 , 1 , -  三种字符构成 (注:这里的第三种字符是减号), R初始时为空 。 每次研究,Zay 会带着一个美丽的长度为 m的字符串T 来找 Kri 玩,Kri 非常羡慕 Zay 拥有如此美丽的 字符串,便也想用字符串S 和R 变出字符串T 。 具体地, Kri 将会进行 n次操作。每次操作中
作者:亿万年的星光 分类:题解目录 浏览:

【题解】数学游戏

【题目描述】

Kri 喜欢玩数字游戏。 一天,他在草稿纸上写下了t 对正整数(x,y) ,并对于每一对正整数计算出了z=x*y*gcd(x,y);可是调皮的 Zay 找到了 Kri 的草稿纸,并把每一组的 y都擦除了,还可能改动了一些 z。

现在 Kri 想请你帮忙还原每一组的 y,具体地,对于每一组中的 x和 z,你需要输出最小的正整数 y,使得 z=x*y*gcd(x,y)  。如果这样的 y不存在,也就是 Zay 一定改动了z ,那么请输出 -1。 注:gcd(x,y) 表示 x和 y的最大公约数,也就是最大的正整数 d,满足 既是x 的约数,又是 y的约数。

【输入描述】

第一行一个整数 t ,表示有 对正整数 x和z 。

 接下来 t 行,每行两个正整数 x和z ,含义见题目描述。

【输出描述】

对于每对数字输出一行,如果不存在满足条件的正整数y ,请输出-1 ,否则输出满足条件的最小正整 数 y。

【样例输入1】

1  10 240

【样例输出1】

12

【样例1解释】

x*y*gcd(x,y)=10*12*gcd(10,12)=240

【样例输入2】

3  5 30  4 8  11 11

【样例输出2】

6  -1  1

【数据范围】

对于20%的数据,t,x,z<=103。 

对于40%的数据,t<=103,  x<106,  z<=109。 

对于另30% 的数据,t<104 。 

对于另20% 的数据,x<106 。 

对于100%的数据,1<=t<=5*105, 1<=x<=109, 1<=z<=263

标签: noi online

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