信息学奥赛试题精选33题(附带题解).doc_第1页
信息学奥赛试题精选33题(附带题解).doc_第2页
信息学奥赛试题精选33题(附带题解).doc_第3页
信息学奥赛试题精选33题(附带题解).doc_第4页
信息学奥赛试题精选33题(附带题解).doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第110题为基础题,第1120题为提高题,第2133为综合题注:因为在本文档中需要用到一些特殊的数学符号(如:求和号、分数等),所以当您在百度文库中浏览时,一些数学符号可能会显示不出来,不过当您把本文档下载下来在本地浏览时,所有的符号即可全部都显示出来。_基础题:【1 Prime Frequency】【问题描述】给出一个仅包含字母和数字(0-9, A-Z 以及 a-z)的字符串,请您计算频率(字符出现的次数),并仅报告哪些字符的频率是素数。输入:输入的第一行给出一个整数T ( 0T201),表示测试用例个数。后面的T行每行给出一个测试用例:一个字母-数字组成的字符串。字符串的长度是小于2001的一个正整数。输出:对输入的每个测试用例输出一行,给出一个输出序列号,然后给出在输入的字符串中频率是素数的字符。这些字符按字母升序排列。所谓“字母升序”意谓按ASCII 值升序排列。如果没有字符的频率是素数,输出“empty”(没有引号)。样例输入样例输出3ABCCAABBBBDDDDDABCDFFFFCase 1: CCase 2: ADCase 3: empty注: 试题来源:Bangladesh National Computer Programming Contest在线测试:UVA 10789提示 先离线计算出22200的素数筛u。然后每输入一个测试串,以ASCLL码为下标统计各字符的频率p,并按照ASCLL码递增的顺序(0i299)输出频率为素数的字符(即upi=1且ASCLL码值为i的字符)。若没有频率为素数的字符,则输出失败信息。【2 Twin Primes】【问题描述】 双素数(Twin Primes)是形式为(p, p+2),术语“双素数”由Paul Stckel (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),其中“空格”是空格字符(ASCII 32)。本题设定第100000对的素数小于20000000。样例输入样例输出1234(3, 5)(5, 7)(11, 13)(17, 19)注: 试题来源:Regionals Warmup Contest 2002, Venue: Southeast University, Dhaka, Bangladesh在线测试:UVA 10394提示设双素数对序列为ans。其中ansi存储第i对双素数的较小素数(1inum)。ans的计算方法如下:使用筛选法计算出2,20000000的素数筛u;按递增顺序枚举该区间的每个整数i:若i和i+2为双素数对(ui&ui+2),则双素数对序列增加一个元素(ans+num=i)。在离线计算出ans的基础上,每输入一个编号s,则代表的双素数对为(anss,anss+2)。【3 Less Prime】【问题描述】设n为一个整数,100n10000,请找到素数x,x n,使得n-p*x最大,其中 p是整数,使得p*xn(p+1)*x。输入:输入的第一行给出一个整数M,表示测试用例的个数。每个测试用例一行,给出一个整数N,100N10000。输出:对每个测试用例,输出一行,给出满足上述条件的素数。 样例输入样例输出543996148201101704822033114111533527注: 试题来源:III Local Contest in Murcia 2005在线测试:UVA 10852提示要使得n-p*x最大(x为素数,p为整数,p*x n(p+1)*x),则x为所有小于n的素数中,被n除后余数最大的一个素数。由此得出算法:先离线计算出211111的素数表su,表长为num。然后每输入一个整数n,则枚举小于n的所有素数,计算tmp=,满足条件的素数即为对应tmp=n%suk的素数suk。【4 Prime Words】【问题描述】一个素数是仅有两个约数的数:其本身和数字1。例如,1, 2, 3, 5, 17, 101和10007是素数。本题输入一个单词集合,每个单词由a-z以及A-Z的字母组成。每个字母对应一个特定的值,字母a对应1,字母b对应2,以此类推,字母z对应26;同样,字母A对应27,字母B对应28,字母Z对应52。一个单词的字母的总和是素数,则这个单词是素单词(prime word)。请编写程序,判定一个单词是否为素单词。输入:输入给出一个单词集合,每个单词一行,有L个字母,1L20。输入以EOF结束。输出:如果一个单词字母的和为素数,则输出“It is a prime word.”;否则输出“It is not a prime word.”。 样例输入样例输出UFRNcontestAcMIt is a prime word.It is not a prime word.It is not a prime word.注: 试题来源:UFRN-2005 Contest 1在线测试:UVA 10924提示由于字母对应数字的上限为52,而单词的长度上限为20,因此我们首先使用筛选法,离线计算出21010的素数素数筛u。然后每输入一个长度为n的单词,计算单词字母对应的数字和X=若x为21010中的一个素数(ux=1),则表明该单词为素单词;否则该单词非素单词。【5 Sum of Different Primes】【问题描述】一个正整数可以以一种或多种方式表示为不同素数的总和。给出两个正整数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。样例输入样例输出24 324 22 11 14 218 317 117 317 4100 51000 101120 140 0231002101552001028992079324314注:试题来源:ACM Japan 2006在线测试:POJ 3132,ZOJ 2822,UVA 3619提示设 su为2.1200的素数表;fij为j拆分成i个素数和的方案数(1i14, suij1199)。显然,边界值f00=1。首先,采用筛选法计算素数表su,表长为num。然后每输入一对n和k,使用动态规划方法计算k个不同素数的和为n的方案总数:枚举su表中的每个素数sui(1inum) 按递减顺序枚举素数个数j(j=141): 按递减顺序枚举前j个素数的和p(p=1199sui): 累计sui作为第j个素数的方案总数fjp+=fj-1p-sui;最后得出的fkn即为问题解。【6 Common Permutation】【问题描述】给出两个小写字母的字符串,a和b,输出最长的小写字母字符串x使得存在x的一个排列,是a的子序列,同时也存在x的一个排列是b的子序列。输入:输入有若干行。连续的两行组成一个测试用例,也就是说,第1和第2行构成一个测试用例,第3和第4行构成一个测试用例,等等。每个测试用例的第一行是字符串a,第二行是字符串b。每个字符串一行,至多由1000个小写字母组成。输出:对每个测试用例,输出一行,给出x。如果有若干个x满足上述要求,选择按字母序列第一个。样例输入样例输出prettywomenwalkingdownthestreetenwet注: 试题来源:World Finals Warm-up Contest, University of Alberta Local Contest在线测试:UVA 10252提示试题要求按递增顺序输出两串公共字符的排列。计算方法如下: 设S1=a1a2,S2= b1b2。先分别统计S1中各字母的频率c1i和S2中各字母的频率c2i(1i26,其中字母a对应数字1, 字母b对应数字2,,字母z对应数字26)。然后计算S1和S2的公共字符的排列:递增枚举i(1i26),若i对应的字母在S1和S2中同时存在(c1i0)&(c2i0),则字母a+i在排列中出现k=minc1i,c2i次。【7 Anagram】【问题描述】给出一个字母的集合,请您编写一个程序,产生从这个集合能构成的所有可能的单词。例如:给出单词abc,您的程序产生这三个字母的所有不同的组合输出单词abc, acb, bac, bca, cab 和cba。程序从输入中获取一个单词,其中的一些字母会出现一次以上。对一个给出的单词,程序产生相同的单词只能一次,而且这些单词按字母升序排列。输入:输入给出若干单词。第一行给出单词数,然后每行给出一个单词。一个单词是由A到Z的大写或小写字母组成。大写字母和小写字母被认为是不同的,每个单词的长度小于13。输出:对输入中的每个单词,输出这个单词的字母产生的所有不同的单词。输出的单词按字母升序排列。大写字母排在相应的小写字母前,即AaBb.Zz。样例输入样例输出3aAbabcacbaAabAbaaAbabAbAabaAabcacbbacbcacabcbaaabcaacbabacabcaacabacbabaacbacabcaacaabcabacbaa注: 试题来源:ACM Southwestern European Regional Contest 1995在线测试:POJ 1256,UVA 195提示建立字母与整数间的对应关系:字母a对应0,字母A对应1;;字母z对应50,字母Z对应51。为了按照字母升序的要求生成单词的所有排列,首先将单词的所有字母转化为数字,然后递增排序数串,排列中每个位置的数字按由左而右顺序从数串中选择。设单词长度为l,数串的第i个位置已访问标志为v1i,初始时v1清零;数字k对应的字母已使用标志为v2k,v2为递归程序内的局部变量(0il-1,0k51)。生成所有排列的计算过程为一个递归子程序:void dfs(int d) /从当前位置d出发,递归计算单词的所有排列if (d=l) 输出当前数字排列对应的单词; /生成单词的一个排列elsev2清零; /所有字母未确定for(int i=0;il;i+) /按由左而右顺序从数串中选择d位置的字母:若数串的第i个位置未访问且对应字母未在排列中出现,则设访问标志,该字符进入排列中的第d个位置 if(!v1i&!v2i位置字母对应的数字) v1i=1;v2i位置字母对应的数字=1;i位置字母对应的数字放入当前排列的d位置;dfs(d+1); /递归排列的第d+1个位置v1i=0; /恢复数串的第i个位置未访问标志 显然,主程序设数串的所有位置未访问(v1清零),递归调用dfs(0),便可按字母升序要求输出单词的所有排列。【8 How Many Points of Intersection?】【问题描述】给出两行,在第一行有a个点,在第二行有b个点。我们用直线将第一行的每个点与第二行的每个点相连接。这些点以这样的方式排列,使得这些线段之间相交的数量最大。为此,不允许两条以上的线段在一个点上相交。在第一行和第二行中的相交点不被计入,在两行之间允许两条以上的线段相交。给出a和b的值,请计算P(a, b),在两行之间相交的数量。例如,在下图中a = 2,b = 3,该图表示P(2, 3) = 3。输入:输入的每行给出两个整数a ( 0a20000)和b ( 0avg,则栈中有hi-avg块砖头被移动。贪心使用这个度量标准是正确的,因为砖头被移动至高度低于avg的栈中。由于砖块总数除以栈的数目是可除尽的,因此这些栈中的砖头是不须再移动的。由此得出最少移动的砖数ans=【13 Minimal coverage】【问题描述】给出直线的若干条线段,直线是X轴,线段的坐标为Li, Ri。求最少要用多少条线段可以覆盖区间0, m。输入:输入的第一行给出测试用例的数目,后面给出一个空行。每个测试用例首先给出一个整数M(1M5000),接下来若干行,每行以Li Ri(|Li|, |Ri|50000, i100000)表示线段。每个测试用例以“0 0”为结束。两个测试用例之间用一个空行分开。输出:对每个测试用例,输出的第一行是一个数字,表示覆盖区间0, m的最少线段数。接下来若干行表示选择的线段,给出线段的坐标,按左端(Li)排序。程序不处理0 0。若无解,即0, m不可能被给出的线段覆盖,则输出0(没有引号)。在两个连续的测试用例之间输出一个空行。样例输入样例输出21-1 0-5 -32 50 01-1 00 10 0010 1注: 试题来源:USU Internal Contest March2004在线测试:UVA 10020,Ural 1303提示把所有线段按左端点为第一关键字、右端点为第2关键字递增排序(LiLi+1|( Li = Li+1)&( Ri Ri+1),1i线段数-1)。选取覆盖线段的度量标准:在所有左端点被覆盖线段中找右端点最远的线段。 贪心实现的过程:设当前线段覆盖到的位置为now; 所有左端点被覆盖的线段中可以覆盖最远的位置为 len,该线段为k。初始时ans=now=len=0。依次分析序列中的每条线段: if (Linow)&(lennow) &(nowlen) now=len ;将线段k作为新增的覆盖线段 if (nowm)输出覆盖线段并退出程序; 分析了所有线段后nowm,说明无法覆盖0, m,无解退出。【14 Annoying painting tool】【问题描述】你想知道一个恼人的绘画工具是什么吗?首先,本题所讲的绘画工具仅支持黑色和白色,因此,图片是一个像素组成的矩形区域,像素不是黑色就是白色。其次,只有一个操作改变像素的颜色:选择一个r行c列的像素组成的矩形,这个矩形是完全在一个图片内。作为操作的一个结果,在矩形内的每个像素会改变其颜色(从黑到白,从白到黑)。最初,所有的像素是白色的。创建一个图片,应用上述的操作数次。你能描绘出你心目的那幅图片吗?输入:输入包含若干测试用例。每个测试用例的第一行给出4个整数n,m,r和c,(1 r n 100, 1 c m 100),然后的n行每行给出您要画的图的一行像素。第i行由m个字符组成,描述在结束绘画时第i行的像素值(0表示白色,1表示黑色)。最后一个测试用例后的一行给出4个0。输出:对每个测试用例,输出产生最终绘画结果需要操作的最小数;如果不可能,输出-1。样例输入样例输出3 3 1 10101010104 3 2 10111100111103 4 2 20110011100000 0 0 046-1注: 试题来源:Ulm Local 2007在线测试:POJ 3363提示进行一次操作的度量标准:当前子矩阵左上角的像素和目标矩阵的对应像素的颜色不同。贪心实现的方法如下 由左而右、自上而下枚举子矩阵的左上角aij (1in-r+1,1jm-c+1): 若左上角像素的颜色与目标矩阵对应元素的颜色不同(aij!=bij),则操作次数c+1;子矩阵内所有像素的颜色取反(akl=1,iki+k-1,jlj+c-1)。 最后再检验一遍当前矩阵a和目标矩阵b是否完全一样。若还有不一样的地方,则说明无解;否则c为产生最终绘画结果需要操作的最少次数。【15 Troublemakers】【问题描述】每所学校都有麻烦制造者(troublemaker) 那些孩子们可以使教师的生活苦不堪言。一个麻烦制造者还是可以管理的,但是当你把若干对麻烦制造者放在同一个房间里,教学就变得非常困难。在Shaida夫人的数学课上有n个孩子,其中有m对麻烦制造者。情况变得如此的差,使得Shaida夫人决定将一个班级分成两个班级。请您帮Shaida夫人将麻烦制造者的对数减少至少一半。输入:输入的第一行给出测试用例数N,然后给出N个测试用例。每个测试用例的第一行给出n (0n100)和m (0m5000),然后m行每行给出一对整数u和v,表示u和v在同一个房间里的时候,他们是一对麻烦制造者。孩子编号从1到n。输出:对于每个测试用例,先输出一行Case #x:,后面给出L 要转到另一间房间的孩子的数目,下一行列出那些孩子。在两个房间中麻烦制造者对数的总数至多是m/2。如果不可能,则输出Impossible.代替L,然后输出一个空行。样例输入样例输出24 31 22 33 44 61 21 31 42 32 43 4Case #1: 31 3 4Case #2: 21 2注: 试题来源:Abednegos Graph Lovers Contest, 2006在线测试:UVA 10982提示以孩子为节点,每对麻烦制造者之间连边,构造无向图g。设两个班级分别对应集合s0和集合s1,其中s1中的人数较少。依次确定每个孩子i(1in)所在的班级:将孩子1孩子i-1中与孩子i结对制造麻烦的孩子划分成s0和s1集合。若s1中的孩子数较少,则孩子i送入s1集合,这就是孩子i转移到另一间房间的度量标准。贪心实现的方法是依次搜索每个节点i(1in): 统计节点1i-1中与节点i有边相连的点在集合s0和集合s1的点数; 若s1中的点数较少,则节点i送入s1集合;最后s1集合中的节点对应要转到另一间房间的孩子。【16 Constructing BST】【问题描述】BST(Binary Search Tree,二叉搜索树)是一个用于搜索的有效的数据结构。在一个BST中,所有左子树中的元素小于根,右子树中的元素大于根。我们通常通过连续地插入元素来构造BST,而插入元素的顺序对于树的结构有很大的影响。请看下例:在本题中,我们要给出从1到N的整数来构造BST,使得树的高度至多为H。BST的高度定义如下:1. 没有结点的BST的高度为0;2. 否则,BST的高度等于左子树和右子树的高度的最大值加1。可以存在若干顺序可以满足这一要求。在这种情况下,取小数字排在前的序列。例如,对于N=4,H=3,我们给出的序列是1 3 2 4,而不是2 1 4 3或3 2 1 4。输入:每个测试用例给出两个正整数N(1N10000)和H(1H30)。输入以N=0,H=0结束,这一情况不用处理。至多有30个测试用例。输出:对于每个测试用例,输出一行,以“Case #: “开始,其中#是测试用例的编号;然后在这一行中给出N个整数的序列,在一行的结束没有多余的空格。如果无法构造这样的树,则输出“Impossible.”(没有引号)。样例输入样例输出4 34 16 30 0Case 1: 1 3 2 4Case 2: Impossible.Case 3: 3 1 2 5 4 6注:试题来源:ACM ICPC World Finals Warmup 1,2005在线测试:UVA 10821提示试题要求输出BST的前序遍历,即第一个输出根。因为要求字典序最小,所以要让根尽量小。对于把编号为1到n的节点排成一个高度不高于h的bst,左右子树的节点数不应超过2h-1-1。根节点的度量标准是若根的右侧可以放满节点,则根的编号root为n-(2h-1-1);否则根的编号root为1,即根编号root=max1,n-(2h-1-1)。之后问题就转化成了把编号为1到root-1的节点排成一个高度不高于h-1的左bst子树和把编号为root+1到n的节点排成一个高度不高于h-1的右bst子树。上述贪心解法是递归定义的,可递归解决。【17 Ordering Tasks】John有n项任务要做。不幸的是,这些任务并不是独立的,有的任务只有在其他一些任务完成以后才能开始做。输入:输入由几个测试用例组成。每个用例的第一行给出两个整数:1n100和m。n是任务的数量 (从1到n编号),m 是在两个任务之间直接优先关系的数量。然后是m行,每行两个整数i和j,表示任务i必须在任务j之前执行。以实例n=m=0结束输入。输出:对每个测试用例,输出一行,给出n个整数,表示任务执行的一个可能的顺序。样例输入样例输出5 41 22 31 31 50 01 4 2 5 3注: 试题来源:GWCF Contest 2 (Golden Wedding Contest Festival)在线测试:UVA 10305提示任务作为节点,两个任务之间的直接优先关系作为边:若任务i必须在任务j之前执行,则对应有向边,这样可将任务间的先后关系转化为一张有向图,使得任务执行的一个可能的顺序对应这张有向图的拓扑排序。设节点的入度序列为ind,其中节点i的入度为indi(0in-1);邻接表为lis,其中节点i的所有出边的另一端点存储在lisi中,lisi为一个List容器队列q存储当前入度为0的节点,队首指针为h,队尾指针为t;我们在输入信息的同时构建邻接表lis,计算节点的入度序列为ind,并将所有入度为0的节点送入队列q;然后依次处理q队列中每个入度为0的节点: 取出队首节点x; lisx容器中每个相邻节点的入度-1,相当于删除x的所有出边; 新增入度为0的节点入q队列;依次类推,直至队列空为止。相继出队的节点q0qn-1 即为一个拓扑序列。【18 Spreadsheet】在1979年,Dan Bricklin和Bob Frankston编写了第一个电子制表应用软件VisiCalc,这一软件获得了巨大的成功,并且在那时成为Apple II计算机的重要应用软件。现在电子制表是大多数计算机的重要的应用软件。电子制表的思想非常简单,但非常实用。一个电子制表由一个表格组成,每个项不是一个数字就是一个公式。一个公式可以基于其他项的值计算一个表达式。文本和图形也可以加入用于表示。请编写一个非常简单的电子制表应用程序,输入若干份表格,表格的每一个项或者是数字(仅为整数),或者是支持求和的公式。在计算了所有公式的值以后,程序输出结果表格,所有的公式都已经被它们的值代替。 输入:输入文件第一行给出测试用例中的表格的数目。每个表格的第一行给出用一个空格分开的两个整数,表示表格的列数和行数,然后给出表格,每行表示表格的一行,每行由该行的项组成,每个项用一个空格分开。 一个项或者是一个数字值,或者是一个公式。一个公式由一个等号开始(=),后面是一个或多个用加号(+)分开的项的名称,这样公式的值是在相应的项中的所有值的总和。这些项也可以是一个公式,在公式中没有空格。可以设定在这些项之间没有循环依赖,因此每个表格可以是完全可计算的。每一个项的名字是由1到3个字母(按列),后面跟着数字从1到999(按行)组成。按列的字母构成如下序列:A, B, C, ., Z, AA, AB, AC, ., AZ, BA, ., BZ, CA, ., ZZ, AAA, AAB, ., AAZ, ABA, ., ABZ, ACA, ., ZZZ。这些字母相应于从1到18278的数字,如图所示,左上角的项取名为A1。左上方的项的命名图 输出:除了表格的数目以及列和行的数目不重复以外,程序输出和输入的格式一样。而且,所有的公式要被它们的值取代。样例输入样例输出14 310 34 37 =A1+B1+C140 17 34 =A2+B2+C2=A1+A2 =B1+B2 =C1+C2 =D1+D210 34 37 8140 17 34 9150 51 71 172注: 试题来源:1995 ACM Southwestern European Regional Contest在线测试:POJ 1420,UVA 196提示在表达式中各项的命名格式,字母AZZZ代表列,数字1999代表行。需要将列字母转化为列序号,行数串转化为行序号。转化方法:A代表1,Z代表26,字母序列ckc1对应一个26进制的列序号y=;数串bpb1应一个十进制的行序号x=。即表达式中的项ckc1 bpb1对应表格位置(x,y)。 设数值表格为w; 表达式项所在位置值为d,(i,j)对应位置值d=j*1000+i,即d % 1000为行号,为列号。 我们将表格转化为一个有向图:每项为一个节点,数值项与表达式项间的关联关系为有向边。若数值项(x,y)对应表达式项(i,j)中的某项,则(x,y)连一条有向边至(i,j)。设相邻矩阵为g,其中gxy存储与数值项(x,y)关联的所有表达式项的位置值;表达式项的入度序列为ind,即(i,j)中的表达式目前含indij个未知项。显然indij=0,表明(i,j)为数值项;构造有向图我们边输入表格边构造有向图:若(i,j)为数值项,则数值存入wij;若(i,j)为表达式项,则取出其中的每一项,计算其对应的行号x和列号y,(i,j)的位置值送入gxy邻接表,并累计(i,j)的入度(+indij)。使用删边法计算有向图的拓扑序列首先将图中所有入度为0的节点(数值项)的位置值送入队列q;然后依次按下述方法处理队列中的每一项:取出队首节点的位置值,将之转化为(x,y)。依次取gxy中与数值项(x,y)相关联的每个表达式项的位置值,转化为表格位置(tx,ty), 将(x,y)的值计入(tx,ty)中的表达式项(wtxty+=wxy),(tx,ty)的入度-1(-indtxty)。若入度减至0,则(tx,ty)的位置值送入q队列。 依次类推,直至队列空为止。最后输出数值表格w。【19 Genealogical Tree】火星人直系亲属关系的系统非常混乱。火星人在不同的群体中群居生活,因此一个火星人可以有一个父母,甚至也可以有十个父母;而且一个火星人有100个孩子也不会让人感到奇怪。火星人已经习惯了这样的生活方式,对于他们来说这很自然。在行星理事会(Planetary Council)中,这样混乱的家谱系统导致了一些尴尬。这些火星人中的杰出人士去参加会议,为了在讨论中不冒犯长辈,讨论中总是辈分高的火星人优先发言,然后是辈分低的火星人发言,最后是辈分最低还没有子女的火星人发言。然而,这个秩序的维持确实不是一个简单的任务。一个火星人并不知道他所有的父母(当然也不知道他的所有的祖父母),但如果一个孙子在比他年轻的曾祖父之前发言,这就是一个重大的错误了。请编写一个程序,对所有的成员定义一个次序,这个次序要保证理事会的每一个成员所在的位置先于他的所有后代。输入:标准输入的第一行只包含一个整数N,1N100,表示火星理事会(Martian Planetary Council)的成员数。理事会成员的编号从1到N。在后面给出N行,而且第i行给出第i个成员的孩子的列表。孩子的列表是孩子编号按任意次序用空格分开的一个序列。孩子的列表可以为空。列表(即使是空列表)以0结束。输出:标准输出仅给出一行,给出一个编号的序列,编号以空格分开。如果存在几个序列满足这一问题的条件,请输出其中任何一个。这样的序列至少存在一个。样例输入样例输出504 5 1 01 05 3 03 02 4 5 3 1注: 试题来源:Ural State University Internal Contest October2000 Junior Session在线测试:Ural 1022提示将火星人设为节点,父亲与儿子之间连一条有向边。这个有向图的拓扑序列即为所有成员的次序。 我们边输入信息边构造相邻矩阵g,并统计节点的入度序列ind(其中gx存储x的所有儿子,indx为节点x的入度值)。 接下来,将所有入度为0的节点送入队列q 。然后依次处理队列q中的每个节点: 取队首节点x;x的每个儿子的入度-1。若减至0,则该儿子进入队列q; 依次类推,直至队列空为止。 最后输出输出拓扑序列,即q的出队顺序。【20 Rare Order】一个珍稀书籍的收藏家最近发现了一本用一种陌生的语言写的一本书,这种语言采用和英语一样的字母。这本书有简单的索引,但在索引中的条目的次序不同于根据英语字母表给出的字典排序的次序。这位收藏家试图通过索引来确定这个古怪的字母表的字符的次序,(即对索引条目组成的序列进行整理),但因为任务冗长而乏味,就放弃了。请编写程序完成这位收藏家的任务,程序输入一个按特定的序列排序的字符串集合,确定字符的序列是什么。输入:输入是由大写字母组成的字符串的有序列表,每行一个字符串。每个字符串最多包含20个字符。该列表的结束标志是一个单一字符的一行。并不是所有的字母都被用到,但该列表蕴涵对于被采用的那些字母存在着一个完全的次序。 输出:输出一行大写字母,字母的排序顺序列按输入数据进行整理所给出。 样例输入样例输出XWYZXZXYZXWYWWX#XZYW注: 试题来源:1990 ACM ICPC World Finals 在线测试:UVA 200,UVA 5139提示输入字符串的有序列表T(T表的长度为tot),按照下述方法将T表转化为有向图的相邻矩阵v:每个大写字母为一个节点,节点序号为字母对应的数值(大写字母序列AZ映射为数值序列126),T表中同一位置上不同字母代表的节点间连有向边:for (int i = 0; i tot; i+)for (int j = i + 1; j tot; j+) len = min(Ti的串长, Tj的串长); for (int k=0; klen; k+) if (Ti中第k个字母 != Tj中第k个字母) vTi中第k个字母对应的节点序号Tj中第k个字母对应的节点序号=true; break; 计算有向图的拓扑序列,拓扑序列中节点对应的字母即为字母表中字符的次序。计算方法如下初始化:置图中所有节点未访问标志,统计节点的入度(若vij=true,则inqi=inqj=true,+indj。1i,j26);将入度为0的节点(inqi & indi=0)送入队列q。依次处理队列q中的节点:取出队首节点x,x的所有相邻节点i的入度减1。若减至0(vxi & -indi = 0),则i节点入队。依此类推,直至队列空为止。此时出队顺序对应的字母即为字母表中字符的次序。综合题:【21 Pushing Boxes】想象您正站在一个二维的迷宫中,迷宫由是正方形的方格组成,这些方格可能被岩石阻塞,也可能没有。您可以向北,南,东或西一步移到下一个方格。这些移动被称为行走(walk)。 在一个空方格中放置了一个箱子,您可以挨着箱子站着,然后按这个方向推动这个箱子,这个箱子就可以被移到一个临近的位置。这样的一个移动被称为推(push)。除了推以外,箱子不可能用其他的方法被移动,这就意味着如果您把箱子推到一个角落,您就永远不能再把它从角落中推出。一个空格被标识为目标空格。您的任务就是通过一系列的行走和推把一个箱子推到目标方格中(如图)。因为箱子非常重,您希望推的次数最少。您能编写一个程序来给出最佳的序列吗?图 输入:输入文件包含若干个迷宫的描述,每个迷宫描述的第一行给出两个整数r和c (都小于等于20),表示迷宫的行数和列数。后面给出r行,每行有c个字符。每个字符描述迷宫的一个方格。一个塞满岩石的方格用一个#表示,一个空方格用一个.表示。你开始时站的位置用S表示,箱子开始的位置用B表示,目标方格用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论