掌握简单数据结构知识,并结合已学算法和数学知识编写程序,解决问题。
1. 指针类型。
2. 一般线性表,队列,堆栈,二叉树的存储和遍历。
3. 排列与组合,高精度数值处理。
4. 二分算法,快速排序,深度优先搜索,宽度优先搜索,简单动态规划。
5. 圆排列,可重集排列,鸽笼原理,素因数分解,幂函数,指数函数,对数函数,三角函数,模运算,不等式基础知识。
1. 能运用常用算法和简单数据结构解决实际问题。
2. 能从算法本质出发,分析相关算法之间的本质联系。
3. 具备初步的数学建模能力。
1. 与NOIP普及组复赛相衔接。采用上机编程考核方式,共4个试题,考核时间:3小时。
2. 在NOIP普及组复赛中成绩列全国前40%。
试题名:摆花
文件名:flower
试题描述:
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
输入数据:
输入文件flower.in,共2行。
第一行包含两个正整数n和m,中间用一个空格隔开。
第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1、a2、…….an。
输出数据:
输出文件名为flower.out。
输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。
输入输出样例:
flower.in flower.out
2 4 2
3 2
样例说明:有2种摆花的方案,分别是(1,1,1,2),(1,1,2,2)。括号里的1和2表示两种花,比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。
数据范围:
对于20%数据,有0 对于50%数据,有0 对于100%数据,有0 参考题解: 本题可采用简单动态规划。设f[i,j]表示前i种花放在前j个花盆里的最大方案数,那么: f[i,j]=sum(f[i-1,j-x]) (0<=x<=min(a[i],j)) 状态转移方程的含义为:前j个花盆里,第i种花最少放0个,最多放min{a[i],j}个。 其中min{a[i],j}表示第i种花的数目和花盆的数目中较少的那一个。 边界条件:f[1,j]=1 (i<=a[1])。