重点试题汇总.docx
《重点试题汇总.docx》由会员分享,可在线阅读,更多相关《重点试题汇总.docx(37页珍藏版)》请在冰豆网上搜索。
重点试题汇总
findk(快速排序)
输入两个整数n和k,以及n个整数(绝对值都不超过109)。
求这n个数从小到大排列后,排在第k位的数是多少。
1<=n<=10000000;1<=k<=n。
输入:
findk.in
第一行是n和k,接下来的n行,每行一个整数。
输出:
findk.out
一个整数,表示这n个数从小到大排列后,排在第k位的数是几。
样例:
输入
54
9
2
8
16
3
输出
9
逃离农场(深度优先搜索)
一些牛要乘坐一艘船趁着黑夜逃离农场,但船可能容纳不下所有的牛。
一共有N头牛,1<=N<=20。
每头牛的体重分别是w[1]..w[N]。
要从中选出尽可能多的牛,使得他们上船后,船不会沉没。
船是否会沉没取决于:
将他们的体重相加,如果不产生进位,船就不会沉。
输入格式:
(escape.in)
第一行是整数N。
接下来的N行,每行一个正整数,分别表示牛的体重。
体重都不超过100000000(108)。
输出格式:
(escape.out)
一个整数,表示最多可以选几头牛。
他们的体重相加时没有进位。
样例:
输入
5
522
6
84
7311
19
输出
3
解释:
三头牛的重量分别是522、6和7311,这三个相加时没有进位:
522
6
+7311
------
7839
采药(背包问题)
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。
为此,他想拜附近最有威望的医师为师。
医师为了判断他的资质,给他出了一个难题。
医师把他带到一个到处都是草药的山洞里对他说:
“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。
我会给你一段时间,在这段时间里,你可以采到一些草药。
如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。
”
如果你是辰辰,你能完成这个任务吗?
输入:
输入文件medic.in的第一行有两个整数T(1<=T<=1000)和M(1<=M<=100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。
接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出:
输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内(可以不花完所有时间),能采到的草药的最大总价值。
样例
输入
703
71100
691
12
输出
3
数据规模
对于30%的数据,M<=10;
对于全部的数据,M<=100。
堆集装箱(搜索或动态规划)
有N个集装箱,3<=N<=20。
每个集装箱的长各不相同,宽也各不相同。
集装箱不允许旋转,即长和宽不能互换。
现在要在这些集装箱中选择若干个堆叠起来。
要求上面集装箱的长必须小于下面集装箱的长,上面集装箱的宽也必须小于下面集装箱的宽。
问最多能选几个集装箱堆成一堆。
输入:
btwr.in
第一行是N。
接下来的N行,每行两个正整数,分别表示集装箱长和宽。
输出:
btwr.out
一个整数,表示最多能选几个集装箱堆成一堆。
样例:
输入
6
69
1012
911
810
78
53
输出
5
解释:
可以选择以下5个集装箱:
53
69
810
911
1012
可能还有别的方案。
2的N次方(高精度计算)
给出一个整数N(0<=N<=265),精确地输出2的N次方的值(当然,不能以0开头)。
题目名称:
ptwo
输入格式:
*第一行:
整数N
样例输入(文件ptwo.in):
100
输出格式:
*第一行:
2的N次方
样例输出(文件ptwo.out):
1267650600228229401496703205376
公牛数学(高精度计算)
公牛自称可以计算很大的整数之间的乘法,并得到精确的结果。
农夫约翰想知道他们的答案是否正确。
请你帮助他检查公牛的答案。
读入2个正整数(不大于10^40),计算他们的乘积,输出一个自然数(最高位不能含有多余的零)。
输入格式:
*第1..2行:
每行包含一个十进制数
样例输入(文件名:
bullmath.in):
11111111111111
1111111111
输出格式:
*第1行:
读入的两个数的正确的乘积
样例输出(文件名:
bullmath.out):
123456789011110987654321
等差三元组(枚举优化)
一个等差三元组是一个升序的三元组(s1,s2,s3),其中s2-s1与s3-s2相等。
例如:
(1,2,3),(2,4,6)和(14,21,28)。
给出一个有S(3<=S<=30)个元素的递增整数序列,各整数不重复出现,整数的范围在1..100之间,输出其中包含的等差三元组的个数。
程序名称:
lseq
输入格式:
*第一行:
一个整数S
*第二行:
S个用空格分开的整数,递增序列的元素。
样例输入(文件lseq.in):
7
1234689
输出格式:
*第一行:
一个整数,等差三元组的个数,保证一个32位的整型变量可以
容纳此整数
样例输出(文件lseq.out):
5
输出解析:
这是那些符合题意的等差三元组:
123
234
246
369
468
Volume(快速排序+统计技巧)
直线上有N个点,每个点的坐标都是整数,1<=N<=10000。
求每对点之间的距离总和的两倍。
坐标范围是0到1000000000。
输入:
volume.in
第一行是N。
接下来的N行,每行一个整数,表示每个点的坐标。
输入:
volume.out
一个整数,表示每对点之间的距离总和的两倍。
样例:
输入
5
1
5
3
2
4
输出
40
巨大的牛棚bigbrn(动态规划)
农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。
他讨厌在他的农场中砍树,
想找一个能够让他在空旷无树的地方修建牛棚的地方。
假定他的农场划分成NxN的方格。
输入数据中包括有树的方格的列表。
你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚。
牛棚的边必须和水平轴或者垂直轴平行。
考虑下面的方格,它表示农夫约翰的农场,'.'表示没有树的方格,'#'表示有树的方格
12345678
1........
2.#...#..
3........
4........
5........
6..#.....
7........
8........
最大的牛棚是5x5的,可以建造在方格右下角的两个位置其中一个。
输入格式:
(bigbrn.in)
第1行:
两个整数:
N(1<=N<=1000),农场的大小,和T(1<=T<=10000)有树的方格的数量。
第2到T+1行:
两个整数(1<=整数<=N),有树格子的横纵坐标。
输出格式:
(bigbrn.out)
输出文件只由一行组成,约翰的牛棚的最大边长。
样例
输入:
83
22
26
63
输出:
5
比武大会(动态规划或贪心)
参赛者围成一个圆圈,每个人可以和跟他相邻的人比武,胜利者留在原地,失败者淘汰出局。
大会的组织者已经知道每位选手的能力值,能力值大的一定可以战胜能力值小的(能力值相同时,不会有平局,必有一方被淘汰)。
同时为了比赛更加激烈,他们倾向于让能力值接近的选手比武。
所以他们想安排一个比武的顺序,在不改变参赛者现在位置的条件下,使得所有比赛中两名选手能力值差别的总和最小。
输入:
fight.in
第1行1个整数n,表示参赛的人数(2<=n<=200)。
第2行n个数,以此表示圆上第1,2,……,n个人的能力值(为不超过10000的非负数)。
显然,第n个人和第1个人相邻。
输出:
fight.out
一个整数,为n-1场比赛双方能力值差的绝对值之和的最小值。
样例
fight.in
fight.out
3
231
2
蜘蛛网(递推)
蜘蛛拉出n条直线构成无限大的蜘蛛网,这n条直线没有三线共点的情况。
这样的蜘蛛网能有多少种不同的交点数?
例如4条直线的蜘蛛网,可以有0、3、4、5、6共5种不同的交点数情况,这些交点数情况之和为0+3+4+5+6=18。
输入:
web.in
一个数n,1<=n<=100。
输出:
web.out
输出两个数,分别表示有多少种不同的交点数和所有情况中交点数之和,中间用一个空格隔开。
样例
输入:
4
输出:
518
矩形合并enclose(迭代法)
有n个矩形的区域,边都平行于坐标轴。
如果两个矩形内部的公共部分面积大于零,就要合并,合并后仍旧是一个矩形,边都平行于坐标轴,而且是包含着两个矩形的面积最小的矩形。
如下图所示:
*********************
****
****
*++++++++++->**
*+*+**
***+****+**
++**
++++++++++*************
当然,新的矩形也有可能再和其他矩形合并。
求最终有几个矩形和矩形的总面积。
输入:
(enclose.in)
第一行是n,1<=n<=100。
接下来的n行,每行描述一个矩形。
共4个整数,分别表示左下角和右上角的顶点坐标。
坐标分量范围在0到10000之间。
输出:
(enclose.out)
两个整数,用一个空格分开。
分别表示最后合并完的矩形数和矩形的总面积。
样例:
输入
3
0052
8899
2164
输出
225
解释:
两个矩形为(0,0)-(6,4)和(8,8)-(9,9),总面积是6*4+1*1=25。
机器人robots(贪心)
地图标有若干个G,表示垃圾。
有一些捡垃圾的机器人,可以从左上角(1,1)走到右下角,沿途捡起地上的垃圾。
但机器人只能往右或往下走。
求最少需要几个机器人。
下面是一个地图:
以下有两种方案,最少要2个机器人。
输入:
robots.in
有若干行,每行两个整数,表示垃圾的坐标,以00结束。
地图大小不超过24*24,而且坐标从第一行开始从上往下给出,每行从左往右。
输出:
robots.out
一个整数,表示需要的最少机器人数量。
样例:
输入
12
14
24
26
44
47
66
00
输出
2
输入
11
22
44
00
输出
1
无等差三元组nls(搜索优化)
一个等差三元组是指一个升序的三元组(s1,s2,s3),其中s2-s1与s3-s2相等。
例如:
(1,2,3),(2,4,6)和(14,21,28)都是等差三元组。
给出L(4<=L<=13),表示一个升序序列的元素个数。
M(L找出所有正好含L个元素,且可能含有的最大整数为M的正整数递增序列,使序列中不包含等差三元组。
你的程序需要输出符合以上条件的前三个序列,除非总数不到三个。
最后一行输出符合条件的序列的总数。
输入格式:
(文件nls.in)
第一行是两个由空格分开的整数L和M。
输出格式:
(文件nls.out)