NoiP2003提高组复赛试题分析
- 格式:doc
- 大小:69.00 KB
- 文档页数:14
第一题题库NOIP20071.统计数字(count.pas/c/cpp)【问题描述】某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。
已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
【输入】输入文件count.in包含n+1行:第1行是整数n,表示自然数的个数。
第2~n+1行每行一个自然数。
【输出】输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。
每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
【输入输出样例】【限制】40%的数据满足:1<=n <=100080%的数据满足:1<=n <=50000100%的数据满足:1<=n <=200000,每个数均不超过1 500 000 000(1.5*109)NOIP20081. 笨小猴(wird.pas/c/cpp)【问题描述】笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。
但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果maxn-minn 是一个质数,那么笨小猴就认为这是个Lucky Word ,这样的单词很可能就是正确的答案。
【输入】输入文件word.in 只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
【输出】输出文件word.out 共两行,第一行是一个字符串,假设输入的的单词是Lucky Word ,那么输出“Lucky Word ”,否则输出“No Answer ”;第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn 的值,否则输出0。
第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组竞赛用时:3小时)1、津津的储蓄计划(Save.pas/dpr/c/cpp)【问题描述】津津的零花钱一直都是自己管理。
每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。
因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。
津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。
到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。
有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。
如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。
如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
【输出文件】输出文件save.out包括一行,这一行只包含一个整数。
如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。
【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】1580【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
Day1铺地毯【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。
一共有n 张地毯,编号从1 到n。
现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。
注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
【输入】输入文件名为 carpet.in。
输入共 n+2 行。
第一行,一个整数 n,表示总共有n 张地毯。
接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。
第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。
【输出】输出文件名为 carpet.out。
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。
【输入输出样例 1】【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。
【输入输出样例 2】【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。
【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。
【一句话题意】给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。
【考察知识点】枚举【思路】好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。
置答案ans=-1,按顺序枚举所有矩形,如果点在矩形内则更新ans。
注意题中给出的不是对角坐标,实际上是(a,b)与(a+g,b+k)。
第九届分区联赛提高组初赛试题(提高组PASCAL 语言二小时完成)●●全部答案均要写在答案卷子上,写在试卷纸上一律无效●●一.单项选择题 (共10题,每题1.5分,共计15分。
每题有且仅有一个正确答案.)。
1. 图灵 (Alan Turing) 是 ( )。
A) 美国人 B) 英国人 C) 德国人 D) 匈牙利人 E) 法国人2. 第一个给计算机写程序的人是( )。
A) Alan Mathison Turing B) Ada Lovelace C) John von Neumann D) John Mc-Carthy E) Edsger Wybe Dijkstra3. 十进制数2003等值于二进制数( )。
A) 010******* B) 10000011 C) 110000111 D) 11111010011 E) 11110100114. 假设A=true,B=false,C=ture,D=ture,逻辑运算表达式A∧B∨C∧D的值是( )。
A) ture B) false C) 0 D) 1 E) NULL5. 一个高度为h 的二叉树最小元素数目是( )。
A) 2h+1 B) h C) 2h-1 D) 2h E) 2h-16. 已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素是13,则第五个出队列的元素是( )。
A) 5 B) 41 C) 77 D) 13 E) 187. 下面一段程序是用( )语言书写的。
int func1(int n){int i,sum=0;for(i=1;i<=n;i++)sum+=i*i;return sum;}A) FORTRAN B) PASCAL C) C D) PROLOG E) BASIC8. 设全集E={1,2,3,4,5},集合A={1,4},B={1,2,5},C={2,4},则集合(A ∩B)∪~C 为( )。
第二十届全国青少年信息学奥林匹克竞赛NOI2003第二试有关附加文件的信息,请参看具体的题目说明。
数据生成器【题目背景】小明在做NOI2003练习赛的《幸福的老鼠》时觉得题目太简单了,于是对原题做了一些扩展:●将原题的N从20扩展到200000。
●将原题经过一条街道需要的时间改为Ti(1 £ Ti £ 1000000000)分钟(i为街道的编号)。
●增加了一个条件:小狗家Y离老鼠家X的距离小于等于大狗家Z离老鼠家X的距离。
即使这样,他仍然很快地做了出来。
于是,小明打算做一些输入文件来测试他的程序。
现在他已经生成了一些符合题意的图,不过为了增大测试数据的难度,他希望你能帮他选取一组X、Y、Z,使老鼠拿到礼物的时间尽可能地大。
【小明扩展的题目(注意,你并不需要解决此题)】幸福的老鼠Jerry要过生日了,小狗大狗分别送了它一份生日礼物。
现在Jerry打算从自己家X出发,先到小狗家Y(因为小狗家Y离老鼠家X的距离小于等于大狗家Z离老鼠家X的距离),再到大狗家Z,将两份礼物取回。
卡通城由N(3 £ N £ 200000)个居住点和N-1条连接居住点的双向街道组成,经过第i 条街道需花费Ti(1 £ Ti £ 1000000000)分钟的时间。
可以保证,任两个居住点间都存在通路。
不妨设Jerry家在点X,小狗家在点Y,大狗家在点Z。
现在,请你计算,Jerry最快需要耗费多长时间才能拿到生日礼物?【任务描述】定义:令|AB|表示卡通城中从A点走到B点需要的最少时间。
给出卡通城的地图,找到一组X、Y、Z,使得:|XY|≤|XZ||XY|+|YZ|最大。
并求出此时|XY|+|YZ|的值。
【输入文件】输入文件jerrygen.in第一行是两个整数N(3 £ N £ 200000)和M(M=N-1),分别表示居住点总数和街道总数。
从第2行开始到第N行,每行给出一条街道的信息。
第九届全国(quán ɡuó)青少年信息学奥林匹克联赛(NOIP2003)提高(tí gāo)组试题(2003年11月29日三小时(xiǎoshí)完成)一. 传染病控制(kòngzhì)问题(wèntí)背景近来,一种新的传染病肆虐全球,蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病蔓延。
不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。
于是,蓬莱国的疾病控制中心决定采取切断传播途径的方法来控制疾病传播。
经过WHO(世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究清楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。
问题描述:研究表明,这种传染病的传播具有两种很特殊的性质:第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不得病,或者是XY之间的传播途径被切断,则X不会得病。
第二是,这种疾病的传播有同期性,在一疾病传播周期之内,传染病将只会感染一代患者,而不会再传播给下一代。
这些性质大大减轻了蓬莱国疾病防控的压力,并且也们已经得到了国内部分易感人群的潜在传播途径图(一棵树)。
但是,麻烦还没有结束。
由于蓬莱国疾控中心人手不够,同时没有强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有传播途径相连,且连接途径没有被切断的人群)。
当不可能有健康人被感染时,疾病就中止传播。
所以,蓬莱国疾控中心要制定一个切断传播途径的顺序,以使尽量少的人被感染。
你的程序要针对给定的树,找出合适的切断顺序。
输入格式:输入格式的第一行是两个整数N(1<=n<=300)和p.接下来是p行,每一行有两个整数i和j,表示节点i和j间有边相连(意即,第i人和第j人之间有传播途径相连)。
历年NOIP(普及组)难度分析 by Climber.pINOIP提高组复赛考察点详细分析动态规划:12 模拟:10数学:5 图论:4搜索:4 构造:3贪心:2【动态规划】平均难度系数:0.55此项为历届NOIP考察次数最多的知识点。
主要有 1.区间模型 2.子序列模型 3.资源分配模型以及一些简单的多维状态设计技巧。
动态规划可以与图,树,高精度等知识点配合出题。
【模拟】平均难度系数:0.76平均每届NOIP都会出现1个模拟题。
这种题一般算法很简单,需要选手细心理解题目意思,注意细节。
考察选手的代码实现能力。
【数学】平均难度系数:0.46需要掌握质数及其性质,基础的实属操作,加法原理和乘法原理。
此类题需要选手对数学规律的灵感。
【图论】平均难度系数:0.50历届考察点基本上都是 1.最短路问题和 2.特殊图的性质。
特殊图包括树,拓扑图,二分图等。
历届NOIP在图论上的考察并不是很多。
【搜索】平均难度系数:0.38历届搜索题一般都比较难,搜索算法本身简单,于是题目会提高选手对其他方面的要求。
主要有搜索优化和模拟。
写搜索题时应该以尽量多得分为目标。
【构造】平均难度系数:0.27构造类题目一般没有明确的算法,需要选手仔细分析题目的实质,并得出解法。
这个解法通常不是唯一的。
有时一个好的贪心可以得相当多的分。
有时搜索剪枝可以很大的提高效率。
同样以多得分为目标。
【【贪心】平均难度系数:0.75此类题需要选手对算法的直觉,贪心正确性一旦被证明,通常题目就简单了。
历年NOIP(普及组)难度分析by Climber.pI年份题目名称考查内容难度1998 Three 枚举☆Factor 高精度运算★Power 数学(进制转换)★★1999 Cantor表模拟或数学★☆回文数字符串处理★★旅行家的预算动态规划或贪心★★☆2000 计算器的改良字符串处理★★税收与补贴问题数学或枚举★★乘积最大动态规划★★★单词接龙回溯★★★★2001 数的计算动态规划★最大公约数和最小公倍数数学(辗转相除法)★求先序排列树的遍历☆装箱问题0/1背包或枚举★2002 级数求和循环结构☆选数生成算法、素数判定★★★产生数简单图论★★★★过河卒递推或动态规划★☆2003 乒乓球字符串处理★☆数字游戏动态规划★★★★★栈数学(卡特兰数)★★麦森数分治、高精度运算★★★2004 不高兴的津津模拟☆花生采摘贪心★FBI树树的遍历★★火星人生成算法★★★2005 淘淘摘苹果模拟☆校门外的树模拟★采药0/1背包★循环高精度运算、数论、快速幂★★★★★2006 明明的随机数冒泡排序(去重)★开心的金明0/1背包★Jam计数法生成算法、字符串★★★数列数学(进制转换)★☆2007 奖学金冒泡排序(双关键字)★纪念品分组贪心、排序算法★☆守望者的逃离动态规划或枚举★★★Hanoi双塔问题数学、高精度★☆2008 ISBN号码字符串处理★排座椅贪心★★传球游戏动态规划★★★立体图字符输出★★★2009 多项式输出字符串处理★分数线划定快速排序(双关键字)★细胞分裂数论★★★★道路游戏动态规划★★★★★2010 数字统计枚举★接水问题模拟★导弹拦截排序+枚举★★★★三国游戏贪心★★★2011 (160)数字反转模拟、字符串★统计单词数模拟、字符串函数★瑞士轮模拟、快排、滚动数组★★★表达式的值栈、表达式计算、递推★★★★★2012 (150)质因数分解枚举★寻宝模拟,模运算★★摆花动态规划★★★★文化之旅搜索、最短路、动规★★★★☆/view/e1cdc430376baf1ffc4fad0c.htmlNOIP提高组复赛考察点详细分析题目编号题目名主考察点知识点系数NOIP-2000-A 进制转换数学初等代数,找规律0.6 NOIP-2000-B 乘积最大动态规划资源分配DP 0.7 NOIP-2000-C 单词接龙搜索DFS,字符串,模拟0.5 NOIP-2000-D 方格取数动态规划多维状态0.6 NOIP-2001-A 一元三次方程求解数学数学,枚举,实数处理0.5 NOIP-2001-B 数的划分动态规划资源分配DP,多维状态DP 0.7 NOIP-2001-C 统计单词个数动态规划资源分配DP,字符串0.3 NOIP-2001-D Car的旅行路线图论最短路,实数处理0.7 NOIP-2002-A 均分纸牌贪心贪心,模拟0.8 NOIP-2002-B 字串变换搜索BFS,字符串0.5 NOIP-2002-C 自由落体数学数学,物理,模拟,实数处理0.6 NOIP-2002-D 矩形覆盖构造动态规划/贪心/搜索剪枝0.2 NOIP-2003-A 神经网络图论拓扑排序,递推0.4 NOIP-2003-B 侦探推理模拟枚举,模拟,字符串0.5 NOIP-2003-C 加分二叉树动态规划树,区间DP 0.4 NOIP-2003-D 传染病控制构造随机贪心/搜索剪枝0.2 NOIP-2004-A 津津的储蓄计划模拟模拟0.9 NOIP-2004-B 合并果子贪心最优哈夫曼树,排序0.7 NOIP-2004-C 合唱队形动态规划子序列DP 0.7 NOIP-2004-D 虫食算搜索搜索剪枝,模拟0.2 NOIP-2005-A 谁拿了最多奖学金模拟模拟,字符串0.8 NOIP-2005-B 过河动态规划子序列DP,贪心优化0.2 NOIP-2005-C 篝火晚会数学置换群,贪心0.2 NOIP-2005-D 等价表达式模拟字符串,抽样检测,表达式0.3 NOIP-2006-A 能量项链动态规划区间环DP 0.6NOIP-2006-B 金明的预算方案动态规划资源分配DP,构造0.6 NOIP-2006-C 作业调度方案模拟模拟0.7 NOIP-2006-D 2^k进制数动态规划动态规划/组合数学,高精度0.5 NOIP-2007-A 统计数字模拟排序 1.0 NOIP-2007-B 字符串的展开模拟字符串,模拟0.7 NOIP-2007-C 矩阵取数游戏动态规划区间DP,高精度0.6 NOIP-2007-D 树网的核图论最短路,树的直径0.4 NOIP-2008-A 笨小猴模拟质数判断,字符串 1.0 NOIP-2008-B 火柴棒等式模拟枚举,优化/开表0.8 NOIP-2008-C 传纸条动态规划多维状态DP 0.7 NOIP-2008-D 双栈排序构造枚举,贪心/二分图0.4 NOIP-2009-A 潜伏者模拟字符串,模拟0.9 NOIP-2009-B Hankson的趣味题数学初等数论,质因数,组合数学0.4 NOIP-2009-C 最优贸易图论最短路0.5 NOIP-2009-D 靶形数独搜索搜索优化0.3 NOIP-2010-A 机器翻译模拟NOIP-2010-B 乌龟棋动态规划动态规划优化NOIP-2010-C 关押罪犯二分答案二分答案或并查集NOIP-2010-D 引水入域广搜+动规判断有解和无解NOIP-2011-D1A 铺地毯枚举,模拟循环队列NOIP-2011-D1B 选择客栈枚举二分查找、NOIP-2011-D1C Mayan游戏深搜剪支NOIP-2011-D2A 计算系数组合二项式系数NOIP-2011-D2B 聪明的质监员二分答案部分和优化NOIP-2011-D2C 观光公交贪心递推分析NOIP-2012-D1A Vigenere密码枚举模拟左偏移位NOIP-2012-D1B 国王游戏贪心排序后列出NOIP-2012-D1C 开车旅行平衡树或链离线深搜,动态规划、倍增NOIP-2012-D2A 同余方程不定方程递归,扩展欧几里得NOIP-2012-D2B 借教室线段树枚举、线段树、二分NOIP-2012-D2C 疫情控制二分答案二分答案,贪心,倍增动态规划:12 模拟:10数学:5 图论:4搜索:4 构造:3贪心:2【动态规划】平均难度系数:0.55此项为历届NOIP考察次数最多的知识点。
第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组竞赛用时:3小时)1、津津的储蓄计划(Save.pas/dpr/c/cpp)【问题描述】津津的零花钱一直都是自己管理。
每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。
因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。
津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。
到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。
有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。
如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。
如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
【输出文件】输出文件save.out包括一行,这一行只包含一个整数。
如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。
【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】1580【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
全国信息学奥林匹克分区联赛(NOIP)复赛提高组试题第一届全国信息学奥林匹克分区联赛(NOIP1995)复赛试题(提高组竞赛用时:3.5小时)1、编码问题设有一个数组A:ARRAY[0..N-1]OFINTEGER;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。
例如:N=6时,有:A=(4,3,0,5,1,2)此时,数组A的编码定义如下:A[0]的编码为0;A[i]的编码为:在A[0],A[1],…,A[i-1]中比A[i]的值小的个数(i=1,2,…,N-1)∴上面数组A的编码为:B=(0,0,0,3,1,2)程序要求解决以下问题:①给出数组A后,求出其编码。
②给出数组A的编码后,求出A中的原数据。
2、灯的排列问题设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……N k(k表示不同颜色灯的个数)。
放灯时要遵守下列规则:①同一种颜色的灯不能分开;②不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数);R=2(红灯数);B=3(蓝灯数),放置的方法有:R-B顺序B-R顺序放置的方法总数为12种。
数据输入的方式为:NP1(颜色,为一个字母)N1(灯的数量)P2 N2……Q(结束标记,Q本身不是灯的颜色)程序要求:求出一种顺序的放置(排列)方案及放置(排列)方案总数。
3、积木块上的数字设有一个四层的积木块,1~4层积木块的数量依次为:5,6,7,8,如下图所示放置:其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出来的。
计算的方法是:第三层的某个数据A是由第四层相邻的两个数据B,C经过某种计算后产生的:计算所用到的计算符为:+,-,⨯,且无优先级之分(自左向右计算),运算符最多为2个。
如:3+4⨯5=35 5⨯4+3=23可以看出,上图中的第三层的数据是由第四层的数据用以下计算公式计算出来的:A=B⨯C+B也就是:8=2⨯3+2,15=3⨯4+3,……14=2⨯6+2程序要求:给出第四层与第三层的数据后,将第一、二层的每块积木标上相应的数据,并输出整个完整的积木图及计算公式。
NOIP 2003 解题报告问题描述NOIP 2003 是全国青少年信息学奥林匹克竞赛的一道题目。
题目要求解决一个与排列组合相关的问题。
给定一个整数 n,求出由 1 到 n 组成的排列中,能被 2、3、5 整除的排列个数。
解决思路分析问题题目要求计算能被 2、3、5 整除的排列个数。
首先我们需要明确一个概念,什么是排列。
在数学中,排列是指从给定的元素中取出一定数量的元素,按照一定的顺序进行排列。
在本题中,我们需要取出 n 个元素,即 1 到 n 这 n 个整数。
所以我们需要找到所有可能的排列,并计算其中能被 2、3、5 整除的排列个数。
暴力求解一种最简单的方法是使用暴力求解的方式。
我们可以使用递归的方式生成所有的排列,然后逐个判断是否满足条件。
具体步骤如下:1.定义一个方法countPermutations,接收三个参数:当前已生成的排列permutation,剩余可选的元素numbers,以及能被 2、3、5 整除的排列个数count。
2.在countPermutations方法中,如果numbers数组为空,则说明已经生成了一个排列。
此时,判断该排列是否满足条件,即是否能被 2、3、5 整除。
如果满足条件,则将count加一。
3.如果numbers数组不为空,则进行递归。
遍历numbers数组中的每个元素num,将其从numbers中移除,并将num加入到permutation中。
然后调用countPermutations方法,传入更新后的permutation、numbers和count。
4.最后,返回计数结果count。
优化解法尽管暴力求解方法可以解决问题,但其时间复杂度非常高,随着 n 的增大,计算时间会呈指数级增长。
因此,我们需要寻找更加高效的解法。
观察题目要求,我们可以发现,能被 2、3、5 整除的排列个数实际上是与最小公倍数有关的。
如果一个排列能够被 2、3、5 整除,那么它一定能被它们的最小公倍数整除。
noip2003普及组复赛解题报告NOIP2003普及组复赛试题NOIP2003普及组复赛试题试题输入:苏州高斌大榕树题一、乒乓球(Table.pas)【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。
其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。
华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。
在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W 表示华华获得一分,L表示华华对手获得一分):WWWWWWWWWWWWWWWWWWW WWWLW在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。
如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。
其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。
其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
【输入样例】WWWWWWWWWWWWWWWWWWWWWWLWE【输出样例】11:011:01:121:02:1题二、数字游戏(Game.pas)【问题描述】丁丁最近沉迷于一个数字游戏之中。
这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。
第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组竞赛用时:3小时)1、津津的储蓄计划(Save.pas/dpr/c/cpp)【问题描述】津津的零花钱一直都是自己管理。
每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。
因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。
津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。
到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。
有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。
如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。
如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
【输出文件】输出文件save.out包括一行,这一行只包含一个整数。
如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。
【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】1580【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
第一题:神经网络【试题分析】一、题意分析1、任务描述:从输入层开始,各节点按照传递公式,一层一层向下传递。
输出输出层中信号大于零的节点编号和信号大小。
(节点编号由小到大)如果没有满足条件的编号则输出NULL。
信号传递公式:∑∈-=Ei jijjiiUCWC),(公式中的Wji(可能为负值)表示连接j号神经元和i号神经元的边的权值。
当Ci大于0时,该神经元处于兴奋状态,否则就处于平静状态。
当神经元处于兴奋状态时,下一秒它会向其它神经元传递信号,信号的强度为Ci。
2、输入:两个整数n(1≤n≤20)和p。
n表示节点的个数;p表示有向边的条数。
下面n行表示1-n号节点的状态和阈值。
下面p行表示有向边及其权值。
3、输出:输出输出层状态大于零的神经元编号和状态,并且按照编号有小到大顺序输出!若输出层的神经元最后状态小于等于0,则输出NULL。
二、问题分析1、题目中给出每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息。
所以不必进行拓扑排序,一层一层的向下传递信号即可。
输出最后一层中信号大于零的节点编号。
2、可以建立一个队列,将输入层节点入队。
3、取队首节点出队,寻找此节点有向边,如果有有向边:1)则记录此节点不是输出层;2)再判断此节点信号大于零则向下传递信号,将指向的节点入队(防止重复入队)。
再出队再传递,直至全部出队。
注意:1)输入层可以是输出层。
2)信号传递公式中只减一次U[i]。
【程序清单】Program network;ConstInName='network.in';OutName='network.out';MM=100;VarInFile,OutFile:Text;C,U:Array[1..MM] Of LongInt;Map:Array[1..MM,1..MM] Of LongInt;Flag:Array[1..MM,1..MM] Of Boolean;IsOut:Array[1..MM] Of Boolean;Queue:Array[1..MM] Of LongInt;N,P,i,Int1,Int2,Head,Rear:LongInt;IsInQueue:Array[1..MM] Of Boolean;IsNull:Boolean;BeginAssign(InFile,InName);Reset(InFile);ReadLn(InFile,N,P);For i:=1 To N Do ReadLn(InFile,C[i],U[i]); FillChar(Flag,SizeOf(Flag),False);For i:=1 To P Do BeginRead(InFile,Int1,Int2);ReadLn(InFile,Map[Int1,Int2]);Flag[Int1,Int2]:=True;End;Close(InFile);FillChar(IsOut,SizeOf(IsOut),True);FillChar(IsInQueue,SizeOf(IsInQueue),False); Head:=1; Rear:=1;For i:=1 To N Do BeginIf C[i]>0 Then BeginQueue[Rear]:=i;Inc(Rear);IsInQueue[i]:=True;EndElse C[i]:=-U[i];End;While Head<Rear Do BeginFor i:=1 To N DoIf Flag[Queue[Head],i] Then BeginIf C[Queue[Head]]>0 Then BeginInc(C[i],Map[Queue[Head],i]*C[Queue[Head]]);If Not IsInQueue[i] Then BeginQueue[Rear]:=i;Inc(Rear);IsInQueue[i]:=True;End;End;IsOut[Queue[Head]]:=False;End;Inc(Head);End;Assign(OutFile,OutName);Rewrite(OutFile);IsNull:=True;For i:=1 To N DoIf IsOut[i] ThenIf C[i]>0 Then BeginWriteLn(OutFile,i,' ',C[i]);IsNull:=False;End;If IsNull Then WriteLn(OutFile,'NULL');Close(OutFile);End.第二题:侦探推理【试题分析】一、题意分析1、任务描述:M个人参加游戏,每人提供一句或多句证言,共P句证言。
其中N个人始终说假话,其余的人始终说真话。
请你通过证言判断出谁是罪犯。
证词中出现的其它话,都不列入逻辑推理的内容。
2、输入:第一行有三个整数,M(1≤M≤20)、N(1≤N≤M)和P(1≤P≤100):M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证人的综述。
接下来M行,每行是明明的一个同学的名字(英文字母组成,没有空格,全部大写)。
往后有P行,每行开始是某个同学的名字,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式,证词每行不会好过250个字符。
输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。
3、输出:如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是罪犯,则输出Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出Impossible。
二、问题分析1、根据题意可知可以利用枚举法完成。
枚举罪犯和今天是星期几。
满足N 个人始终说谎话和M-N个人始终说真话的条件,就可以确定罪犯。
2、首先利用字符串操作将证言转化成计算机可表示的信息。
1)定义Guilty:Array[1..MM,1..MM] Of Integer;{-1..1}FillChar(Guilty,SizeOf(Guilty),0) 初值为0Guilty[i,j]=-1:表示第i个人说第j个人不是罪犯Guilty[i,j]= 1:表示第i个人说第j个人是罪犯其中包含Guilty[i,i]即第i个人说自己是不是罪犯注意:Guilty不可以自相矛盾。
2)定义WhatDay:Array[1..MM,1..7] Of Boolean;FillChar(WhatDay,SizeOf(WhatDay),False)WhatDay[i,j]:=True :表示第i个人说过j是星期几3、枚举罪犯和星期几,判断每句证言是真是假,统计说真假证言的人数。
注意:有可能某人又说过真话,又说过假话。
4、根据题目要求输出罪犯编号或Cannot Determine或Impossible。
【程序清单】Program logic;ConstInName='logic.in';OutName='logic.out';MM=20;DayState:Array[1..7] Of String=('is Monday. #','is Tuesday. #','is Wednesday. #','is Thursday. #','is Friday. #','is Saturday. #','is Sunday. #');cImpossible=-1;cCannotDetermine=-2;VarInFile,OutFile:Text;M,N,P:Integer;Name:Array[1..MM] Of String;Guilty:Array[1..MM,1..MM] Of Integer;{-1..1}WhatDay:Array[1..MM,1..7] Of Boolean;i,j:Integer;IsGuilty:Array[1..MM] Of Boolean;Ans,AnsC:Integer;Procedure Print(ID:Integer);BeginAssign(OutFile,OutName);Rewrite(OutFile);If ID=cImpossible ThenWriteLn(OutFile,'Impossible')Else If ID=cCannotDetermine ThenWriteLn(OutFile,'Cannot Determine')Else WriteLn(OutFile,Name[ID]);Close(OutFile);Halt;End;Procedure SetGuilty(CurID,NextID,NewValue:Integer); BeginIf Guilty[CurID,NextID]=0 ThenGuilty[CurID,NextID]:=NewValueElse If Guilty[CurID,NextID]<>NewValue ThenPrint(cImpossible);End;Procedure ReadStatement;Vari,j,CurID,NextID:Integer;CurStr,CurName:String;BeginFor i:=1 To P Do BeginReadLn(InFile,CurStr);CurStr:=CurStr+' #';CurName:=Copy(CurStr,1,Pos(':',CurStr)-1); CurStr:=Copy(CurStr,Pos(':',CurStr)+2,255); CurID:=0;For j:=1 To M DoIf CurName=Name[j] Then BeginCurID:=j;Break;End;If CurID=0 Then Continue;If CurStr='I am guilty. #' ThenSetGuilty(CurID,CurID,1)Else If CurStr='I am not guilty. #' ThenSetGuilty(CurID,CurID,-1)Else BeginCurName:=Copy(CurStr,1,Pos(' ',CurStr)-1); CurStr:=Copy(CurStr,Pos(' ',CurStr)+1,255); If CurName='Today' Then BeginFor j:=1 To 7 DoIf CurStr=DayState[j] Then BeginWhatDay[CurID,j]:=True;Break;End;EndElse BeginNextID:=0;For j:=1 To M DoIf CurName=Name[j] Then BeginNextID:=j;Break;End;If NextID=0 Then Continue;If CurStr='is guilty. #' ThenSetGuilty(CurID,NextID,1)Else If CurStr='is not guilty. #' Then SetGuilty(CurID,NextID,-1);End;End;End;End;Function Check(CurGuilty,CurDay:Integer):Boolean;VarSayT,SayF:Array[1..MM] Of Boolean;i,j,TCount,FCount:Integer;BeginFillChar(SayT,SizeOf(SayT),False);FillChar(SayF,SizeOf(SayF),False);For i:=1 To M Do BeginIf Guilty[i,CurGuilty]=1 ThenSayT[i]:=TrueElse If Guilty[i,CurGuilty]=-1 Then SayF[i]:=True;End;For i:=1 To M DoFor j:=1 To M DoIf j<>CurGuilty Then BeginIf Guilty[i,j]=1 ThenSayF[i]:=TrueElse If Guilty[i,j]=-1 ThenSayT[i]:=True;End;For i:=1 To M DoIf WhatDay[i,CurDay] Then SayT[i]:=True; For i:=1 To M DoFor j:=1 To 7 DoIf j<>CurDay ThenIf WhatDay[i,j] Then SayF[i]:=True; For i:=1 To M DoIf SayT[i] And SayF[i] Then BeginCheck:=False;Exit;End;TCount:=0; FCount:=0;For i:=1 To M Do BeginIf SayT[i] Then Inc(TCount);If SayF[i] Then Inc(FCount);End;If (FCount>N) Or (M-TCount<N) Then Begin Check:=False;Exit;End;Check:=True;End;BeginAssign(InFile,InName);Reset(InFile);ReadLn(InFile,M,N,P);For i:=1 To M Do ReadLn(InFile,Name[i]);FillChar(Guilty,SizeOf(Guilty),0);FillChar(WhatDay,SizeOf(WhatDay),False);ReadStatement;Close(InFile);FillChar(IsGuilty,SizeOf(IsGuilty),False);For i:=1 To M DoFor j:=1 To 7 DoIsGuilty[i]:=IsGuilty[i] Or Check(i,j);AnsC:=0;For i:=1 To M DoIf IsGuilty[i] Then BeginInc(AnsC);Ans:=i;End;If AnsC=0 ThenPrint(cImpossible)Else If AnsC>1 ThenPrint(cCannotDetermine)Else Print(Ans);End.第三题:加分二叉树【试题分析】一、题意分析1、任务描述:在中序遍历为(1,2,3,…,n)的各种二叉树中,选出加分最高的一棵二叉树,输出最高加分和对此二叉树的前序遍历。