青少年中学生信息学奥赛试题精选33题附带题解.docx
- 文档编号:10580168
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:75
- 大小:226.23KB
青少年中学生信息学奥赛试题精选33题附带题解.docx
《青少年中学生信息学奥赛试题精选33题附带题解.docx》由会员分享,可在线阅读,更多相关《青少年中学生信息学奥赛试题精选33题附带题解.docx(75页珍藏版)》请在冰豆网上搜索。
青少年中学生信息学奥赛试题精选33题附带题解
青少年中学生信息学奥赛试题精选33题(附带题解)
第1~10题为基础题,第11~20题为提高题,第21~33为综合题
基础题:
【1PrimeFrequency】
【问题描述】
给出一个仅包含字母和数字(0-9,A-Z以及a-z)的字符串,请您计算频率(字符出现的次数),并仅报告哪些字符的频率是素数。
输入:
输入的第一行给出一个整数T(0 后面的T行每行给出一个测试用例: 一个字母-数字组成的字符串。 字符串的长度是小于2001的一个正整数。 输出: 对输入的每个测试用例输出一行,给出一个输出序列号,然后给出在输入的字符串中频率是素数的字符。 这些字符按字母升序排列。 所谓“字母升序”意谓按ASCII值升序排列。 如果没有字符的频率是素数,输出“empty”(没有引号)。 样例输入 样例输出 3 ABCC AABBBBDDDDD ABCDFFFF Case1: C Case2: AD Case3: empty 注: 试题来源: BangladeshNationalComputerProgrammingContest 在线测试: UVA10789 提示 先离线计算出[2‥2200]的素数筛u[]。 然后每输入一个测试串,以ASCLL码为下标统计各字符的频率p[],并按照ASCLL码递增的顺序(0≤i≤299)输出频率为素数的字符(即u[p[i]]=1且ASCLL码值为i的字符)。 若没有频率为素数的字符,则输出失败信息。 【2TwinPrimes】 【问题描述】 双素数(TwinPrimes)是形式为(p,p+2),术语“双素数”由PaulStäckel(1892-1919)给出,前几个双素数是(3,5),(5,7),(11,13),(17,19),(29,31),(41,43)。 在本题中请你给出第S对双素数,其中S是输入中给出的整数。 输入: 输入小于10001行,每行给出一个整数S(1≤S≤100000),表示双素数对的序列编号。 输入以EOF结束。 输出: 对于输入的每一行,输出一行,给出第S对双素数。 输出对的形式为(p1,空格p2),其中“空格”是空格字符(ASCII32)。 本题设定第100000对的素数小于20000000。 样例输入 样例输出 1 2 3 4 (3,5) (5,7) (11,13) (17,19) 注: 试题来源: RegionalsWarmupContest2002,Venue: SoutheastUniversity,Dhaka,Bangladesh 在线测试: UVA10394 提示 设双素数对序列为ans[]。 其中ans[i]存储第i对双素数的较小素数(1≤i≤num)。 ans[]的计算方法如下: 使用筛选法计算出[2,20000000]的素数筛u[]; 按递增顺序枚举该区间的每个整数i: 若i和i+2为双素数对(u[i]&&u[i+2]),则双素数对序列增加一个元素(ans[++num]=i)。 在离线计算出ans[]的基础上,每输入一个编号s,则代表的双素数对为(ans[s],ans[s]+2)。 【3LessPrime】 【问题描述】 设n为一个整数,100≤n≤10000,请找到素数x,x≤n,使得n-p*x最大,其中p是整数,使得p*x≤n<(p+1)*x。 输入: 输入的第一行给出一个整数M,表示测试用例的个数。 每个测试用例一行,给出一个整数N,100≤N≤10000。 输出: 对每个测试用例,输出一行,给出满足上述条件的素数。 样例输入 样例输出 5 4399 614 8201 101 7048 2203 311 4111 53 3527 注: 试题来源: IIILocalContestinMurcia2005 在线测试: UVA10852 提示 要使得n-p*x最大(x为素数,p为整数,p*x≤n<(p+1)*x),则x为所有小于n的素数中,被n除后余数最大的一个素数。 由此得出算法: 先离线计算出[2‥11111]的素数表su[],表长为num。 然后每输入一个整数n,则枚举小于n的所有素数,计算tmp= ,满足条件的素数即为对应tmp=n%su[k]的素数su[k]。 【4PrimeWords】 【问题描述】 一个素数是仅有两个约数的数: 其本身和数字1。 例如,1,2,3,5,17,101和10007是素数。 本题输入一个单词集合,每个单词由a-z以及A-Z的字母组成。 每个字母对应一个特定的值,字母a对应1,字母b对应2,以此类推,字母z对应26;同样,字母A对应27,字母B对应28,字母Z对应52。 一个单词的字母的总和是素数,则这个单词是素单词(primeword)。 请编写程序,判定一个单词是否为素单词。 输入: 输入给出一个单词集合,每个单词一行,有L个字母,1≤L≤20。 输入以EOF结束。 输出: 如果一个单词字母的和为素数,则输出“Itisaprimeword.”;否则输出“Itisnotaprimeword.”。 样例输入 样例输出 UFRN contest AcM Itisaprimeword. Itisnotaprimeword. Itisnotaprimeword. 注: 试题来源: UFRN-2005Contest1 在线测试: UVA10924 提示 由于字母对应数字的上限为52,而单词的长度上限为20,因此我们首先使用筛选法,离线计算出[2‥1010]的素数素数筛u[]。 然后每输入一个长度为n的单词,计算单词字母对应的数字和 X= 若x为[2‥1010]中的一个素数(u[x]=1),则表明该单词为素单词;否则该单词非素单词。 【5SumofDifferentPrimes】 【问题描述】 一个正整数可以以一种或多种方式表示为不同素数的总和。 给出两个正整数n和k,请您计算将n表示为k个不同的素数的和会有几种形式。 如果是相同的素数集,则被认为是相同的。 例如8可以被表示为3+5和5+3,但不区分。 如果n和k分别为24和3,答案为2,因为有两个总和为24的集合{2,3,19}和{2,5,17},但不存在其他的总和为24的3个素数的集合。 如果n=24,k=2,答案是3,因为存在3个集合{5,19},{7,17}以及{11,13}。 如果n=2,k=1,答案是1,因为只有一个集合{2},其总和为2。 如果n=1,k=1,答案是0,因为1不是素数,不能将{1}计入。 如果n=4,k=2,答案是0,因为不存在两个不同素数的集合,总和为4。 请您编写一个程序,对给出的n和k,输出答案。 输入: 输入由一系列的测试用例组成,最后以一个空格分开的两个0结束。 每个测试用例一行,给出以一个空格分开的两个正整数n和k。 本题设定n≤1120,k≤14。 输出: 输出由若干行组成,每行对应一个测试用例,一个输出行给出一个非负整数,表示对相应输入中给出的n和k有多少答案。 本题设定答案小于231。 样例输入 样例输出 243 242 21 11 42 183 171 173 174 1005 100010 112014 00 2 3 1 0 0 2 1 0 1 55 200102899 2079324314 注: 试题来源: ACMJapan2006 在线测试: POJ3132,ZOJ2822,UVA3619 提示 设 su[]为[2..1200]的素数表;f[i][j]为j拆分成i个素数和的方案数(1≤i≤14,su[i]≤j≤1199)。 显然,边界值f[0][0]=1。 首先,采用筛选法计算素数表su[],表长为num。 然后每输入一对n和k,使用动态规划方法计算k个不同素数的和为n的方案总数: 枚举su[]表中的每个素数su[i](1≤i≤num) 按递减顺序枚举素数个数j(j=14‥1): 按递减顺序枚举前j个素数的和p(p=1199‥su[i]): 累计su[i]作为第j个素数的方案总数f[j][p]+=f[j-1][p-su[i]]; 最后得出的f[k][n]即为问题解。 【6CommonPermutation】 【问题描述】 给出两个小写字母的字符串,a和b,输出最长的小写字母字符串x使得存在x的一个排列,是a的子序列,同时也存在x的一个排列是b的子序列。 输入: 输入有若干行。 连续的两行组成一个测试用例,也就是说,第1和第2行构成一个测试用例,第3和第4行构成一个测试用例,等等。 每个测试用例的第一行是字符串a,第二行是字符串b。 每个字符串一行,至多由1000个小写字母组成。 输出: 对每个测试用例,输出一行,给出x。 如果有若干个x满足上述要求,选择按字母序列第一个。 样例输入 样例输出 pretty women walking down the street e nw et 注: 试题来源: WorldFinalsWarm-upContest,UniversityofAlbertaLocalContest 在线测试: UVA10252 提示 试题要求按递增顺序输出两串公共字符的排列。 计算方法如下: 设S1=a1a2… ,S2=b1b2… 。 先分别统计S1中各字母的频率c1[i]和S2中各字母的频率c2[i](1≤i≤26,其中字母‘a’对应数字1,字母‘b’对应数字2,…,字母‘z’对应数字26)。 然后计算S1和S2的公共字符的排列: 递增枚举i(1≤i≤26),若i对应的字母在S1和S2中同时存在((c1[i]≠0)&&(c2[i]≠0)),则字母'a'+i在排列中出现k=min{c1[i],c2[i]}次。 【7Anagram】 【问题描述】 给出一个字母的集合,请您编写一个程序,产生从这个集合能构成的所有可能的单词。 例如: 给出单词"abc",您的程序产生这三个字母的所有不同的组合——输出单词"abc","acb","bac","bca","cab"和"cba"。 程序从输入中获取一个单词,其中的一些字母会出现一次以上。 对一个给出的单词,程序产生相同的单词只能一次,而且这些单词按字母升序排列。 输入: 输入给出若干单词。 第一行给出单词数,然后每行给出一个单词。 一个单词是由A到Z的大写或小写字母组成。 大写字母和小写字母被认为是不同的,每个单词的长度小于13。 输出: 对输入中的每个单词,输出这个单词的字母产生的所有不同的单词。 输出的单词按字母升序排列。 大写字母排在相应的小写字母前,即'A'<'a'<'B'<'b'<...<'Z'<'z'。 样例输入 样例输出 3 aAb abc acba Aab Aba aAb abA bAa baA abc acb bac bca cab cba aabc aacb abac abca acab acba baac baca bcaa caab caba cbaa 注: 试题来源: ACMSouthwesternEuropeanRegionalContest1995 在线测试: POJ1256,UVA195 提示 建立字母与整数间的对应关系: 字母‘a’对应0,字母‘A’对应1;…;字母‘z’对应50,字母‘Z’对应51。 为了按照字母升序的要求生成单词的所有排列,首先将单词的所有字母转化为数字,然后递增排序数串,排列中每个位置的数字按由左而右顺序从数串中选择。 设单词长度为l,数串的第i个位置已访问标志为v1[i],初始时v1[]清零;数字k对应的字母已使用标志为v2[k],v2[]为递归程序内的局部变量(0≤i≤l-1,0≤k≤51)。 生成所有排列的计算过程为一个递归子程序: voiddfs(intd){//从当前位置d出发,递归计算单词的所有排列if(d==l)输出当前数字排列对应的单词;//生成单词的一个排列 }else{ v2[]清零;//所有字母未确定 for(inti=0;i 若数串的第i个位置未访问且对应字母未在排列中出现,则设访问标志,该字符进入排列中的第d个位置 if(! v1[i]&&! v2[i位置字母对应的数字]){ v1[i]=1;v2[i位置字母对应的数字]=1; i位置字母对应的数字放入当前排列的d位置; dfs(d+1);//递归排列的第d+1个位置 v1[i]=0;//恢复数串的第i个位置未访问标志 } } } } 显然,主程序设数串的所有位置未访问(v1[]清零),递归调用dfs(0),便可按字母升序要求输出单词的所有排列。 【8HowManyPointsofIntersection? 】 【问题描述】 给出两行,在第一行有a个点,在第二行有b个点。 我们用直线将第一行的每个点与第二行的每个点相连接。 这些点以这样的方式排列,使得这些线段之间相交的数量最大。 为此,不允许两条以上的线段在一个点上相交。 在第一行和第二行中的相交点不被计入,在两行之间允许两条以上的线段相交。 给出a和b的值,请计算P(a,b),在两行之间相交的数量。 例如,在下图中a=2,b=3,该图表示P(2,3)=3。 输入: 输入的每行给出两个整数a(0 输入以a=b=0的一行为结束标志,这一测试用例不用处理。 测试用例数最多1200个。 输出: 对输入的每一行,输出一行,给出序列编号,然后给出P(a,b)的值。 本题设定输出值在64位有符号整数范围内。 样例输入 样例输出 22 23 33 00 Case1: 1 Case2: 3 Case3: 9 注: 试题来源: BangladeshNationalComputerProgrammingContest,2004 在线测试: UVA10790 提示 如3线交于一点,则一定可以通过左右移动一个点使其交点分开,上面线段上的两点与下面线段上的两点可以产生一个交点。 按照乘法原理,p(a,b)= 。 【9Stripies】 【问题描述】 生化学家发明了一种很有用途的生物体,叫stripies,(实际上,最早的俄罗斯名叫polosatiki,不过科学家为了申请国际专利时方便不得不起了另一个英文名)。 stripies是透明,无定型的,群居在一些象果子冻那样的有营养的环境里。 在大部分时间stripies是在移动中,当两条stripies碰撞时,这两条stripies就融合产生一条新的stripies。 经过长时间的观察,科学家们发现当两条stripies碰撞融合在一起时,新的stripies的重量并不等于碰撞前两条stripies的重量。 不久又发现两条重量为m1和m2的stripies碰撞融合在一起,其重量变为2*sqrt(m1*m2)。 科学家很希望知道有什么办法可以限制一群stripies的总重量的减少。 请您编写程序来解决这个问题。 本题设定3条或更多的stripies从来不会碰撞在一起。 输入: 第一行给出N(1≤N≤100),表示群落中stripies的数量。 后面的N行每行为一条stripie的重量,范围为1-1000。 输出: 输出stripies群落可能的最小总重量。 精确到小数点后3位。 样例输入 样例输出 3 72 30 50 120.00 注: 试题来源: ACMNortheasternEurope2001,NorthernSubregion 在线测试: POJ1862,ZOJ1543,Ural1161 提示 设群落中n条stripies的重量为m1m2‥mn。 经过n-1次碰撞后的总重量为 W= 显然,m1m2‥mn按照重量递减的顺序排列,得出的总重量w是最小的。 【10TheProductofDigits】 【问题描述】 请您寻找一个最小的正整数Q,Q的各个位置上的数字乘积等于N。 输入: 输入给出一个整数N(0≤N≤109)。 输出: 输出一个整数Q,如果这个数不存在,则输出−1。 样例输入 样例输出 10 25 注: 试题来源: USULocalContest1999 在线测试: Ural1014 提示 分解N的因子的度量标准: 尽量分解出大因子。 注意,有两个特例: N=0时,Q=0; N=1时,Q=1; 否则采取贪心策略,按从9到2的顺序分解n的因子: 先试将n分解出尽量多的因子9,再试分解出尽量多的因子8…。 若最终分解后的结果不为1,则无解;否则因子由小到大组成最小的正整数Q。 提高题: 【11DemocracyinDanger】 【问题描述】 在Caribbean盆地中的一个国家,所有的决策是由在公民大会上简单的多数投票被通过的。 当地的一个政党,希望权力尽可能地合法,要求改革选举制度。 他们主要论点是,岛上的居民最近增加了,它不再轻易举行公民大会。 改革的方式如下: 投票者被分成K个组(不一定相等),在每个组中对每个问题进行投票,而且,如果一个组半数以上的成员投“赞成”票,那么这个组就被认为投“赞成”票,否则这个组就被认为投“反对”票。 如果超过半数的组投“赞成”票,决议就被通过。 开始岛上的居民高兴地接受了这一做法,然而,引入这一做法的党派,可以影响投票组的构成。 因此,他们就有机会对不是多数赞同的决策施加影响。 例如,有3个投票组,人数分别是有5人,5人和7人,那么,对于一个政党,只要在第一组和第二组各有3人支持就足够了,有6个人赞成,而不是9个人赞成,决议就能通过。 请您编写程序,根据给出的组数和每组的人数,计算通过决议至少需要多少人赞成。 输入: 第一行给出K,表示组数(K≤101);第二行给出K个数,分别是每一组的人数。 K以及每组的人数都是奇数。 总人数不会超过9999人。 输出: 支持某个党派对决策产生影响至少需要的人数。 样例输入 样例输出 3 575 6 注: 试题来源: AutumnSchoolContest2000 在线测试: Ural1025 提示 把每组人数从小到大排序,总共n组,则需要有 +1组同意,即人数最少的前 +1组。 对于一个人数为k的组需要同意,则需要有 +1人同意。 由此得出贪心策略: 人数最少的前 +1组中,每组取半数刚过的人数。 【12BoxofBricks】 【问题描述】 小Bob喜欢玩方块砖,他把砖一块放在另一块的上面堆砌起来,堆成不同高度的栈。 “看,我建了一面墙”,他告诉他的姐姐Alice。 “不,你要让所有的栈有相同的高度,这样你就建了一面真正的墙了。 ”Alice反驳说。 Bob考虑了一下,认为他姐姐是对的。 因此他开始重新一块接一块地重新安排砖块,让所有的栈有着相同的高度。 但由于Bob很懒惰,他要移动砖块的数量最少。 你能帮助他吗? 输入: 输入由若干组测试用例组成。 每组测试用例的第一行给出整数n,表示Bob建的栈的数目。 下一行给出n个数字,表示n个栈的高度hi,本题设定1≤n≤50,并且1≤hi≤100。 砖块的总数除以栈的数目是可除尽的。 也就是说,重新安排砖块使得所有的栈有相同的高度是可以的。 输入由n=0作为结束,程序对此不必处理。 输出: 对每个测试用例,首先如样例输出所示,输出测试用例编号。 然后输出一行"Theminimumnumberofmovesisk.",其中k是移动砖块使得所有的栈高度相同的最小数。 在每个测试用例后输出一个空行。 样例输入 样例输出 6 524175 0 Set#1 Theminimumnumberofmovesis5. 注: 试题来源: ACMSouthwesternEuropeanRegionalContest1997 在线测试: POJ1477,ZOJ1251,UVA591 提示 设平均值avg= ,avg即为移动后栈的相同高度。 第i个栈中砖头被移动的度量标准: 若hi>avg,则栈中有hi-avg块砖头被移动。 贪心使用这个度量标准是正确的,因为砖头被移动至高度低于avg的栈中。 由于砖块总数除以栈的数目是可除尽的,因此这些栈中的砖头是不须再移动的。 由此得出最少移动的砖数ans= 【13Minimalcoverage】 【问题描述】 给出直线的若干条线段,直线是X轴,线段的坐标为[Li,Ri]。 求最少要用多少条线段可以覆盖区间[0,m]。 输入: 输入的第一行给出测试用例的数目,后面给出一个空行。 每个测试用例首先给出一个整数M(1≤M≤5000),接下来若干行,每行以"LiRi"(|Li|,|Ri|≤50000,i≤100000)表示线段。 每个测试用例以“00”为结束。 两个测试用例之间用一个空行分开。 输出: 对每个测试用例,输出的第一行是一个数字,表示覆盖区间[0,m]的最少线段数。 接下来若干行表示选择的线段,给出线段的坐标,按左端(Li)排序。 程序不处理"00"。 若无解,即[0,m]不可能被给出的线段覆盖,则输出"0"(没有引号)。 在两个连续的测试用例之间输出一个空行。 样例输入 样例输出 2 1 -10 -5-3 25 00 1 -10 01 00 0 1 01 注: 试题来源: USUInternalContestMarch'2004 在线测试: UVA10020,Ural1303 提示 把所有线段按左端点为第一关键字、右端点为第2关键字递增排序((Li≤Li+1||((Li==Li+1)&&(Ri 选取覆盖线段的度量标准: 在所有左端点被覆盖线段中找右端点最远的线段。 贪心实现的过程: 设当前线段覆盖到的位置为now;所有左端点被覆盖的线段中可以覆盖最远的位置为len,该线段为k。 初始时ans=now=len=0。 依次分析序列中的每条线段: if(Li≤now)&&(len if(Li+1>now)&&(now if(now≥m)输出覆盖线段并退出程序; 分析了所有线段后now 【14Annoyingpaintingtool】 【问题描述】 你想知道一个恼人的绘画工具是什么吗? 首先,本题所讲的绘画工具仅支持黑色和白色,因此,图片是一个像素组成的矩形
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 青少年 中学生 信息学 试题 精选 33 附带 题解