软件竞赛辅导复习 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
考试试题类型
1、选择题(20分,1分/题)
2、程序填空(30分,3分/空)
3、问答题(20分,10分/题)
4、编程题(30分,15分/题)
问答题复习:
1、什么是算法?算法的主要特性。
2、什么是贪心算法?贪心算法解决背包问题的三种策略。
3、什么是递归算法?递归算法的主要特点。
4、什么是分治法?分治法解决问题的主要步骤。
编程题复习:
1、巨人与鬼
2、黑白棋
3、农场阳光
本课程所学算法及其基本概念:
倒推法、顺推法、贪心算法、0-1背包问题、部分背包问题、递归算法、分治算法、动态规划(与分治的区别)、枚举算法、划分法、欧几里德算法、扩展欧几里德算法、判断两条线段是否相交、凸包问题、回溯法、深度优先搜索、广度优先搜索、博弈树、极大极小博弈树
一、问答题解答:
1、算法是一组(有限个)规则,它为某个特定问题提供了解决问题的运算序列。
算法的五个重要特性:
(1)有穷性;(2)确切性;(2)输入;(3)输出;(4)可行性。
2、贪心算法是指从问题的某一个初始解出发,向给定的目标递推过程。推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择。
贪心算法解决背包问题的三种策略:
(1)第一种贪婪准则——选择价值最大的物品;
(2)第二种贪婪准则——选择重量最轻的物品;
(3)第三种贪婪准则——选择单位重量价值最大的物品。
3、递归算法是指在函数的定义中,首先定义解决问题的函数,然后通过直接或者间接地调用自身函数,最终达到解决问题的过程。
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口;
(3)递归算法解题的运行效率较低;
(4)递归次数过多容易造成栈溢出。
4、分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,最终通过递归法解决这些
子问题的过程。
分治法解决问题的主要步骤:
(1)分解:将原问题分解成一系列子问题;
(2)解决:递归地解各子问题。若子问题足够小,则直接解;
(3)合并:将子问题的结果合并成原问题的解。
二、程序填空题(历届蓝桥杯真题):
1、打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
public class waterflower {
public static void main(String[] args) {
int b1, b2, b3;
for(int m=101; m<1000; m++) {
b3 = m / 100;
b2 =___________;
b1 =___________;
if((b3*b3*b3 + b2*b2*b2 + b1*b1*b1) == m) {
System.out.println(m+"是一个水仙花数"); }
}
}
}
2、一个数如果恰好等于它的因子之和,该数就称为“完数”。例如6=1+2+3。下面是找出1000以内的所有完数的程序。
public class PerfectNumber{
public static void main(String[] args) {
for(int i=1; i<1000; i++) {
int t = 0;
for(int j=1; j<= i/2; j++) {
if(__________== 0) {
t = t + j;
}
}
if(__________) {
System.out.print( t );
}
}
}
3、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?public class Rabbit {
public static void main(String[] args) {
System.out.println("第1个月的兔子对数: 1");
System.out.println("第2个月的兔子对数: 1");
int f1 = 1, f2 = 1, f, M=24;
for(__________; i<=M; i++) {
f = f2;
f2 =__________;
f1 = f;
System.out.println("第" + i +"个月的兔子对数: "+f2);
}
}
}
4、所谓孪生素数指的就是间隔为2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样。最小的孪生素数是(3, 5),在100 以内的孪生素数还有(5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和(71, 73),总计有8 组。
下面的代码求出了正整数n以内(不含n)的所有孪生素数对的个数。比如,当n=100的时候,该方法返回8。
public static boolean isPrime(int x)
{
for(int i=2; i<=x/2; i++)
{
if(x%i==0) _____________;
}
return true;
}
public static int twinPrimeNum(int n)
{
int sum = 0;
for(int i=2; i { if(isPrime(i) && ___________) sum++; } return sum; } 5、我们把“cba”称为“abc”的反转串。求一个串的反转串的方法很多。下面是其中的一种方法,代码十分简洁。