20110719数据结构10级复习赛题级解题报告ccnuoj

来源:互联网 发布:服务器怎么访问数据库 编辑:程序博客网 时间:2024/06/11 15:49

 

题目:ccnu oj 1025--1034

 

A题挺有意思的哈。。。 

 

题目描述:

A 撞来撞去的圆圆的东西

大家以前都玩过弹珠吧,或者橡皮球,或者……呃,反正玩过圆圆的东西是吧(-_-|||||)

好吧,你们可以发挥想象力,头脑中想一个球形物体(弹性、软硬、颜色之类的没有任何限制),之后把它想象成没哟半径的质点。

假设在一个无限长的x轴上有n个质点,每个质点随机选择左右移动,速度均为每秒钟1个单位,如果两个质点相遇,将发生完全弹性碰撞(也就是两个质点各自调头往回走,速度不变)。给定这n个质点的坐标,问T时刻内(含T时刻)所有小球发生碰撞的次数的期望。

输入:

多case,第一行输入n,T,含义见题目描述。其中n<=1000,T<=10^9。

第二行输入n个数,表示n个质点的坐标,坐标范围为[-10^9,10^9]。

输出:

一个数,为所有小球发生碰撞的次数的期望,末尾保留2位小数。

样例输入:

2 1

3 8

2 1

3 4

样例输出:

0.00

0.25

 

 

B 爱攀比的童鞋

众所周知,中国人办事总是要讲点关系,中国人的人际关系一般都相当复杂。比如说你想混ACM就最好和miaowu姐姐攀上亲戚。。。ORZ。。。既然亲戚多了好办事,我们就要构筑一个亲戚网。假如你和xuanflyer是亲戚,xuanflyer和miaowu是亲戚,以后你有什么事也可以通过xuanflyer来找miaowu了,这样一来,你和miaowu也算亲戚了。跟wuyu姐姐一样,很多童鞋比较爱慕虚荣,喜欢攀比,所以总想知道他和他亲戚里面到底谁的钱最多。

输入:对每个样例,第一行:正整数n m q(1<=n,m,q<=100000),表示有n个人,然后m行,每行输入i j,表示i和j是亲戚,然后q行,每行输入i,表示询问i和i的亲戚里面谁的钱最多。

PS:用1—n表示这n个人,第i个人有i万元。

输出:对每个询问,输出一行,输出i和i的亲戚里面谁的钱最多。

样例输入:

5 4 3

1 2

3 4

1 5

2 5

1

2

3

样例输出:

5

5

4

 

 

 

C 教你前缀

什么是前缀你懂吧,不懂?那我告诉你,假如串S1和S2长度分别是len1,len2,len1<=len2且S2的前len1个字母和S1一样,则S1是S2的前缀。CJR不是在给叶老师做项目嘛,今天遇到一个小问题,找到wuyu,wuyu也不会做,那就请教你来了。叶老师给他很多全是英文小写字母字符串,要她统计一下这里面有多少个串可以做其他串的前缀,重复的串只统计一次。

 

输入:正整数n,(n<=40000),然后输入n个字符串,每个字符串长度不超过10个字符。

输出:一行,表示这些串里面能做其他串前缀的串的个数。

样例输入:

6

ababa

aba

bab

ab

b

ab

2

abc

abc

样例输出:

3

1

 

 

D 影响力

给定一个数组,对某个位置而言,其影响范围定义为它左边k个位置到它右边k个位置这之间的所有值,显然最多可以影响2*k+1个元素(包括它自己),我们定义它的影响力为它影响范围内最大值和最小值的差值。

 

输入:正整数n q k,然后输入n个整数,表示这n个元素。然后输入q个询问,对每个询问输出其i,对每个询问输出一行i的影响力。(1<=n,q<=100000)所有结果都在int范围内。

输出:如上所述。

 

样例输入:

5 6 2

7 5 3 9 4

1 3 3 4 5 1

样例输出:

4

6

6

6

6

4

 

E

补充图形

额,给大家看个三角形吧……

7  4  9  3  2

  1  3  2  5

    4  5  7

      9  2

        1

限于排版技术,就这个鬼样了凑合着看吧你们……

可以发现神马规律咩?额,如果看不出来的话可以多看几分钟。

如果实在看不出来,那就继续往下看吧。

众所周知杨辉三角,上面两个数相加可以得到下面一个数,但是为神马这里上面两个数加起来明明可以得到一个两位数而下面那个数却是一位数捏?因为我通通对10取余了的说。

好了,不说废话了,很显然,上面两个数和下面一个数的关系是上面两个数之和mod 10。

那么现在有一些三角形每行都被挖去得只剩下一个数,请你帮忙把这些三角形复原。

输入:

多case,第一行输入一个数1<=n<=1000,表示三角形的行数。

之后n行,其中第一行有n个字符,第二行有n-1个字符……第n行只有1个字符,字符可以是"?",表示这个位置的数字被挖掉,也可以是'0'--'9',表示这个位置的数字为0--9,各个字符之间木有空格,输入数据保证每行有且只有一个为'0'--'9'中的字符,其余都是'?'。如果还不太明白输入方法的可以观察样例输入输出。

输出:

和输入一样的格式,表示复原的三角形。

样例输入:

3

4??

?2

1

4

??5?

??9

?4

6

样例输出

457

92

1

7054

759

24

6

 

 

 

F 此GCD非彼GCD

大家都有一个英文名字,每个名字都由英文小写字母组成,每个人的名字也不会超过10个字符,比如说miaowu。大家都知道抗日战争时期GCD的地下工作做得相当好,上下级之间往往只是单线联系,所以多数你所在组织的人你都不认识。现在要请你帮忙看看某个人是不是和maozd一个组织的(注意,在中国maozd永远是存在的)。

 

输入:正整数m q,然后输入m行,每行两个串s1和s2,表示这两个人单线联系。然后输入q行,每行一个名字,询问这个人和maozd是不是一个组织的。(m<=40000, q<=100000)

输出:如上所述,如果是,输出一行Y,否则输出一行N。如果这个名字不存在,输出X

样例输入:

3 3

abc def

ghi maozd

mno pqu

abc

def

ghi

1 2

abc def

abc

ghi

样例输出;

N

N

Y

N

X

 

 

 

G 数组操作

给定一个n个元素的数组,有如下两种操作:

1 i j 表示将第i个元素变成j(j<=10000)

2 i j 表示求下标i与j之间(包含ij)的所有元素的和。

输入:正整数n q,然后输入n个整数,然后q个操作,2的每个操作输出一行。所有数据及计算范围均在int范围内。(n,q<=100000)

输出:如上描述。

样例输入:

5 4

4 5 7 6 8

2 2 3

1 3 3

2 2 3

2 1 5

样例输出:

12

8

26

 

 

 

H 逆序的人生

给定一个n个元素的数组,这个数组由1…n的一个排列,输出其逆序对数。

输入:正整数n,然后输入n个元素(n<=100000)

输出:一行,表示其逆序数(int范围内)。

样例输入:

5

4 3 1 5 2

样例输出:

6

 

 

I 二叉树好简单

有一棵二叉树,我们知道其知道先序和中序遍历的顺序,请你求出后其后序遍历的顺序。

输入:先序遍历和中序遍历得到的顺序,每个节点用一个英文大写字母表示(所以节点数不会超过26)

输出:其后序遍历的顺序。

样例输入:

DBACEGF ABCDEFG

BCAD CBAD

样例输出:

ACBFGED
CDAB

 

 

J 分糖果1

现有M个糖果,N个人分,每个人心中都有理想的糖果数,每个人的不高兴度为理想中的糖果数与实际分的糖果数的差的绝对值的平方。问怎么分糖果使得总不高兴度最小?输入M,N,接着是N个整数,表示每个人理想中的糖果数。输出最小的总不高兴度,结果在int范围内。1<=n<=10^5,m<=1000000,每个人理想中的糖果数<=100

输入:第一行,一个数t,表示test case数,第二行m n,第三行是n个数,表示每个人理想中的糖果数

输出:最小的总不高兴度输入:

1

10 3

3 3 3

输出:

1

 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

解题报告:

 

A

简单题,首先对于两个球碰撞往回弹,可以当做互相穿过,因此,每两个球最多产生一次碰撞,而对于任意两个球,如果距离d<=2*T,则经过T时段内可能发生碰撞,且发生碰撞的概率是1/4,因此只需要看每两个球是否在T时刻内可能发生碰撞,再将满足条件的小球对的个数除以4即为期望。

 

B:

就简单的并查集模板题,但是需要加上一个钱多少的判断,使得每个节点都指向本集合中钱最多的节点。

 

C:

思路1:先按照字符串长度从小到大排序,这样就保证了所有的串从短到长往trie树里面加串。。。然后每次再从根往下走的时候遇到某一个节点所代表的串已经存在且还没统计过就增加ans值,将所有的字符串插入就可以得到ans了。。。

思路2:将每个节点设置一个标记,如果走过这个位置时就将这个位置的标记变true。将所有的串插入的trie树以后,扫描一遍所有的节点,统计true的个数就是ans值。。。

 

D:

其实本题和pku2823差别不大了。。。

思路1:单调队列,分别统计第i个位置前k和后k个位置的最大值和最小值,然后对每个位置的ans值就显而易见了。。。

思路2:用线段树维护某个位置的范围内的最大最小值,然后就可以求这个值了。。。

 

E:

这个题有一句关键的话要理解了就好做了。。。“输入数据保证每行有且只有一个为'0'--'9'中的字符”,这样就保证了第n行一定知道,然后可以一直往上推。。。orz。。。

 

F:

这个题涉及到trie树和并查集的结合,用并查集实现对每个字符串指定一个编号,然后对每个字符串,找到它所对应的编号,然后进行并查集操作。。。注意这些人名不是事先给出的,是从给定的m组关系中得出的,事先要先将“maozd”加到trie树里面去。。。

 

G:

居然有童鞋直接暴力过了。。。严重bs了测试数据。。。

这是最基础的树状数组和线段树的模型。

思路1:树状数组,初始化先将输入数组a[]的值一个个添加到树状数组sum[]里面去,然后每次对1操作就用更改操作将更改树状数组第i个位置“加上”j-a[i]的值,然后将a[i]的值改成当前值即可,2操作就是基本查询了。。。

思路2:线段树,懂了线段树的童鞋都懂的。。。

 

H:

求逆序数,网上去搜就知道,可以用归并,树状数组,线段树求。。。

标程用树状数组做的,有关键注释。。。

 

I:

Pku2255现题。。。

对给定的这个先序和中序,先序的第一个字母是关键,它一定是这棵树的根,然后根据这个字母在中序遍历的位置,你懂的,其左右的子串就是其左右子树了。。。 这里就可以想到用递归。。。对每一个串,分成其左右子树,层层递归下去。。。后序输出即可。。。

 

J:

无语最喜欢的类型,贪心,大家要习惯啊。。。这题你只要懂得将 |m-sum[理想糖果数]| 尽可能的分摊到这n个人去才能使得结果最小。。。

以下是无语大牛报告:

我们只在意M个糖果与每个人理想的糖果数之和的差(当然是绝对值,因为多多少,和少多少结果是一样的)。现在不妨设,M个糖果比理想的糖果数总和要多。现在的任务就是把多的糖果分出去。我们每个糖果,每个糖果的分,如果现在每个人已经多拿的糖果数为a[i],对于现在的糖果要分给谁,分给a[i]最少的。假设现在最少的a[i]为j,对于任意一个大于j的k。如果把糖给j,这两个人的差的平方和为(j+1)^2+k^2=j^2+k^2+2*j+1,如果给k,那么就是j^2+(k+1)^2=j^2+k^2+2*k+1显然会比上面的大(因为k>j),所以最优的情况就是分给a[i]最少的。从整体来说,就是将相差的平均分配。。。所以先求出相差的绝对值,然后再尽量平均分,如果还有多余的话,随便找几个分就行了。。。

 

 

原创粉丝点击