NOIP2008普及组复赛试题与解题报告

合集下载

NOIP2008提高组复赛试题及题解

NOIP2008提高组复赛试题及题解

全国信息学奥林匹克联赛(NOIP2008)复赛提高组一、题目概览二、提交源程序文件名三、编译命令(不包含任何优化开关)四、运行内存限制注意事项:1. 文件名(程序名和输入输出文件名)必须使用大写。

2. C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3. 全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。

各省在自测时可根据具体配置调整时限。

1. 笨小猴(word.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。

【输入输出样例1】【输入输出样例1解释】单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。

【输入输出样例2】【输入输出样例2解释】单词olympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。

基本的字符串处理,细心一点应该没问题的,不过判断素数时似乎需要考虑下0和1的情况。

var a:array['a'..'z']of integer;s:string;l,i,max,min,n:integer;ch:char;flag:boolean;beginassign(input,'word.in');reset(input);assign(output,'word.out');rewrite(output);readln(s);l:=length(s);fillchar(a,sizeof(a),0);for i:=1 to l doinc(a[s[i]]);max:=0;min:=100;for ch:='a'to 'z' doif a[ch]>0 then beginif a[ch]>max then max:=a[ch];if a[ch]<min then min:=a[ch];end;n:=max-min; flag:=true;if(n=0) or (n=1) then flag:=falseelsefor i:=2 to trunc(sqrt(n)) doif n mod i =0 then begin flag:=false;break;end;if flag then begin writeln('Lucky Word'); writeln(n);endelse begin writeln('No Answer');writeln(0);end;close(output);close(input);end.2. 火柴棒等式(matches.pas/c/cpp)【问题描述】给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。

NOIP2008年题解

NOIP2008年题解

构图完成后从1号开始进行广搜, 构图完成后从 号开始进行广搜,中间若发现有 号开始进行广搜 两个需要被分配到不同栈里的数已经分入同 一栈中就输出0, 一栈中就输出 ,结束程序
最后按照分配之后的顺 序进行输出即可
n<=24,数据范围很小, ①首先用两个循环枚举两个加数的每种情况。 ②然后把两加数相加,算出和,后用三个数所使 用的火柴棒数相加(可以用一个函数计算),判断 所得的和是否等于(n-4)【符号】。 ③如果相等,就把记录答案的计数器变量自加1, 重复步骤①直到循环结束。 下面看代码。
第三题沈艺浩制作, 第三题沈艺浩制作,待插 入。。。。。。
NOIP 2008 解题报告
主讲人: 主讲人: 程志博 沈艺浩
题目名称: 题目名称:
题目1 题目1:笨小猴 题目2 题目2:火柴棒等式 题目3 题目3:传纸条 题目4 题目4:双栈排序
第一题: 第一题:笨小猴
【问题描述】 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛。但是他找到了一种方法,经实验证明, 用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少 的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可 能就是正确的答案。 【输入】 输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。 【输出】 输出文件word.out共两行,第一行是一个字符串,假如输入的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 第二行是一个整数,如果输入单词是Lucky Word,输出maxn—minn的值,否则输出0。 【输入输出样例1】 word.in error word.out Lucky Word 2 【输入输出样例1解释】 单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。 【输入输出样例2】 word.in olymipic word.out No Answer 0 【输入输出样例2解释】 单词olymipic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。

noip普及组复赛模拟试题12答案

noip普及组复赛模拟试题12答案

【试题描述】读入二行整数,然后程序要完成如下的操作:第一步将2行数合并在一起,第二步将合并好的数由大到小排序,第三步重新排列,从第一个数起开始编号,然后将奇数号上的数(样例中的13,9,5)从前向后排,偶数号上的数(样例中的12,7,4)从后往前排。

第四步计算,将排好的数,第一个+第二个数的2倍+第三个数的3倍+…第五步:输出计算的结果。

【输入描述】第一行是一个整数 n(1≤n≤10),第二行有n个整数,整数范围在1~100之间,数与数之间空格隔开。

第三行是一个整数 m(1≤m≤10),第四行有m个整数,整数范围在1~100之间,数与数之间空格隔开。

【输出描述】一个整数(最后计算的结果)。

【输入样例】412 4 5 9213 7【输出样例】 169【解题提示】样例说明:第一步合并后为:12 4 5 9 13 7第二步上例中的数成为:13 12 9 7 5 4第三步得到:13 9 5 4 7 12第四步计算后为:13+2×9+3×5+4×4+5×7+6×12=169最后输出 169【试题来源】 2008年江苏省小学生信息学(计算机)奥赛program ex1731;var m,n,i,j,s,t,b1,b2:integer;a,b,c:array[1..20] of integer;sum:longint;beginreadln(n);for i:=1 to n do read(a[i]);readln(m);for i:=1 to m do read(a[i+n]);s:=m+n;for i:=1 to s-1 dofor j:=i+1 to s doif a[i]<a[j] then begint:=a[i];a[i]:=a[j];a[j]:=t;end;b1:=0;b2:=0;for i:=1 to s doif i mod 2=1 then begin inc(b1); b[b1]:=a[i];endelse begin inc(b2); c[b2]:=a[i];end;for i:=1 to b1 do a[i]:=b[i];for i:=1 to b2 do a[b1+i]:=c[b2-i+1];sum:=0;for i:=1 to s dosum:=sum+i*a[i];writeln(sum);end.输入 615 34 25 9 22 39423 17 46 57输出1496输入1015 34 25 9 22 39 47 12 33 99823 17 46 57 51 8 38 64输出5687SHLQSH数问题描述:我们把t1 , t2 (包括t1 , t2 (1<=t1<t2<=10000000))之间的所有数的约数个数和n称为t1 , t2的shlqsh数;问题是给出数据t1 , t2后,求t1 , t2的shlqsh数;输入输入文件shlqsh.in 仅包含一行,共有两个整数,表示t1 t2 (用空格分开)输出输出文件shlqsh.out 仅有一个整数,表示t1 , t2之间的shlqsh数。

NOIP2008年第十四届全国青少年信息学奥林匹克联赛初赛试题普及组C++

NOIP2008年第十四届全国青少年信息学奥林匹克联赛初赛试题普及组C++

NOIP2008年第十四届全国青少年信息学奥林匹克联赛初赛试题普及组C++第十四届全国青少年信息学奥林匹克联赛初赛试题(普及组 C++语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。

每题有且仅有一个正确答案.)。

1.微型计算机中,控制器的基本功能是()。

A. 控制机器各个部件协调工作B. 实现算术运算和逻辑运算C. 获取外部信息D. 存放程序和数据2. 设A=true,B=false,C=true,D=false,以下逻辑运算表达式值为真的是()。

A. (A∧B)∨(C∧D∨?A)B. ((?A∧B)∨C)∧?DC. (B∨C∨D)∧D∧AD. A∧(D∨?C)∧B3. 在下列关于图灵奖的说法中,不正确的是()。

A. 图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人B. 图灵奖有“计算机界诺贝尔奖”之称C. 迄今为止,还没有华裔计算机科学家获此殊荣D. 图灵奖的名称取自计算机科学的先驱、英国科学家阿兰·图灵4.计算机在工作过程中,若突然停电,()中的信息不会丢失。

A. ROM和RAMB. CPUC.ROMD. RAM5.完全二叉树共有2*N-1个结点,则它的叶节点数是()。

A. N-1B. NC. 2*ND. 2N-16. 在以下各项中,()不是操作系统软件。

A. SolarisB. LinuxC. Windows VistaD. Sybase7.设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈S,出栈的序列为b,d,f,e,c,a,则栈S的容量至少应该是()。

A. 6B. 5C. 4D. 38. 与十进制数28.5625相等的四进制数是()。

A. 123.21B. 131.22C. 130.22D. 130.219. 设字符串S=”Olympic”,S的非空子串的数目是()。

1995-2008复赛试题及解析

1995-2008复赛试题及解析

NOIP1995年复赛试题1. 设有下列的算式:求出□中的数字,并打印出完整的算式来。

8 0 9 ------------- □□) □□□□ □□------------- □□□ □□□ ------------- 12. 方阵填数:在一个N ⨯N 的方阵中,填入1,2,……N ⨯N 个数,并要求构成如下的格式: 例:3. 若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A 类数,否则就称其为B 类数。

例如:(13)10=(1101)2 其中1的个数为3,0的个数为1,则称此数为A 类数; (10)10=(1010)2 其中1的个数为2,0的个数也为2,称此数为B 类数; (24)10=(11000)2 其中1的个数为2,0的个数为3,则称此数为B 类数; 程序要求:求出1~1000之中(包括1与1000),全部A 、B 两类数的个数。

4.编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER ;数组中存放的元素为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 中的原数据。

5. 灯的排列问题:设在一排上有N 个格子(N ≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N 1,N 2,……N k (k 表示不同颜色灯的个数)。

放灯时要遵守下列规则:同一种颜色的灯不能分开;不同颜色的灯之间至少要有一个空位置。

例如:N=8(格子数) R=2(红灯数) B=3(蓝灯数) 放置的方法有:N=513 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6 5N=616 17 18 19 20 1 153****221214 29 36 33 22 3 132****423412 27 26 25 24 5 11 10 9 8 7 6B-R 顺序放置的总数为12种。

NOIP2013复赛模拟8解题报告

NOIP2013复赛模拟8解题报告

NOIP2008模拟试题1(4P24)普及组1.报数(read.pas/c/cpp) OIP2010模拟试题4(4P36)[题目描述]CG同学又弄到一批新牛,新牛到了农场以后,首先要学习汉语,数的朗读成为新牛的一个难题,朗读绝对值小于10亿的数。

新牛们知道汉语中有如下的读数规则:1.首先读符号位,然后读整数部分,整数部分之后可能出现小数点,如果有小数部分则小数点一定出现,并且读出小数点之后读小数部分。

2.符号位的读法是:⑴正数,不论正号”+”是否出现,都不必读出符号位;⑵负数的最左边的符号是”-“,读成”负”(以“F”来表示“负”)。

3.整数部分的读法是:⑴如果整数部分不存在或者整数部分全是零则直接读成“零”(以“0”来表示“零”);⑵否则从整数部分中最左边的非零数字开始读起,然后以十、百、千、万、亿(分别以”S”、”B”、”Q”、”W”、“Y”来表示)等数量单位来拼读整数部分。

4.整数部分中:⑴每一个非零数字都必须结合各个相应的数量单位读出来;⑵每一段连续的“零”只能读成一个“零”,但是某一段连续的“零”的左侧或者右侧不存在非零数字(这里只考虑整数部分)则这一段“零”不应该读出来;5.如果有小数部分,则首先读“点”(以“D”来表示“点”),然后从左至右有顺序地读出各个小数位。

在读小数部分的时候不可以使用十、百、千、万、亿等数量单位;但是小数部分的每一个数字都需要读出来,连续的零不可以读成一个“零”,而应该分别读出。

6.如果数中有小数点而没有小数部分,则不应该把小数点读出来。

例如:-0020030004.567应该读成”F2Q03W04D567”,000.89应该读成”0D89”。

请你编写程序帮助新牛把给定的数正确地读出来。

[输入数据]输入文件仅一行,存放了一个数(不超过50字符),其绝对值小于10亿.[输出数据]输出文件仅一行,输出这个数的正确读法。

[样例输入]-0020030004.567[样例输出]F2Q03W04D567program cz;varst,s,t:string;p,i:integer;beginassign(input,'read.in');reset(input);assign(output,'read.out');rewrite(output);readln(st);if st[1]='-' then begindelete(st,1,1);i:=1;while (i<length(st)) do beginif (st[i]<>'0') then beginwrite('F');break;end;inc(i);end;end;p:=pos('.',st);if (p=0) then p:=length(st);i:=1;while (st[i]='0') and (i+1<p) doinc(i);delete(st,1,i-1);p:=pos('.',st)-1;if (p=-1) then p:=length(st);s:='';i:=(p-1) mod 4+1;while (i>0) and (i<=p) do begint:='';if (i>3) thenif (st[i-3]>'0') thent:=t+st[i-3]+'Q'else if (s<>'') and (s[length(s)]<>'0') thent:=t+'0';if (i>2) thenif (st[i-2]>'0') thent:=t+st[i-2]+'B'else if (t<>'') and (t[length(t)]<>'0') thent:=t+'0';if (i>1) thenif (st[i-1]>'0') thent:=t+st[i-1]+'S'else if (t<>'')and(t[length(t)]<>'0') thent:=t+'0';if (i>0) thenif (st[i]>'0') then t:=t+st[i]+'';if (t[length(t)]='0') then delete(t,length(t),1); if (t<>'') then begins:=s+t;case (p-i) div 4 of1:s:=s+'W';2:s:=s+'Y';end;end;inc(i,4);end;if (s='') then s:='0';write(s);if (pos('.',st)>0)and(length(st)>pos('.',st)) thenwrite('D',copy(st,p+2,length(st)-p-1));writeln;close(input);close(output);end.2.背单词(words)源程序名:words.pas/c/cpp输入文件名:word.in输出文件名:word.out时限:1秒问题描述:英语四级考试临近了,小Y却发现他已经把以前学的单词几乎忘光了。

noip普及组复赛入门测试(答案+测试数据)

noip普及组复赛入门测试(答案+测试数据)

一、新龟兔赛跑(文件名xgtsp.pas)新龟兔赛跑比赛即将举行,此次龟兔赛跑比赛的规则与以往有所不同,不再考察兔子和乌龟谁在最短的时间内跑完规定的路程,而是考察谁在规定时间内跑的路程更长,且兔子和乌龟跑步都是匀速的。

由于兔子的坏习惯,它总喜欢把比赛的总时间T小时中的K小时拿来睡觉。

现在给你比赛的总时间T、兔子的睡觉时间K、兔子的速度U、乌龟的速度V,需要你求出该次比赛谁最后获胜。

输入第一行为一个整数X,表示有X组输入数据。

每组数据只有一行,包括4个数T、K、U、V (1 ≤ T≤ 300,0 ≤ K ≤ T,1 ≤ U ≤ 100,1 ≤ V ≤ 100)。

对于每组数据,输出只有一个数,如果兔子获胜则输出-1,如果乌龟获胜则输出1,如果同时到达则输出0。

允许输入一组数后立即输出对应的结果。

样例输入:21 12 16 2 6 3样例输出:1-1varv,u,t,k,n,i:integer;beginreadln(n);for i:=1 to n do beginreadln(t,k,u,v);if v*t>U*(t-k) then writeln(1);if v*t<U*(t-k) then writeln(-1);if v*t=U*(t-k) then writeln(0);end;end.1、输入:26 2 6 28 6 8 2输出:-12、输入:2300 280 60 20120 0 12 13输出:113、输入:3100 20 50 30100 50 45 25100 80 27 17输出:-1114、输入:3150 77 29 23127 11 22 13139 22 13 7输出:1-1-1二、小球路程(文件名:XQLC.PAS )已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,……。

每次弹起的高度都是上一次高度的一半。

求小球第N次反弹起的高度和球在整个过程所经过的路程(包括下落和反弹),用键盘输入N,输出反弹高度和经过路程,结果保留两位小数。

NOIP2008提高组解题报告

NOIP2008提高组解题报告

NOIP2008提高组石家庄二中李博杰1.笨小猴【问题描述】输入一个由小写字母构成的字符串,统计出现最多与最少字母的个数,若两数之差为质数,输出"Lucky Word"和差值;否则输出"No Answer"和0.【题目类型】模拟【建议编程时间】10分钟(细心一些,避免出错).【解题分析】1,读入字符串(文件)2,构造一个数组,记录a-z各字符出现的次数.枚举字符串中每个字符,将该字符对应数组元素加一.3,枚举数组中a-z,找出最大值和非零最小值,求出它们的差.4,判断差值是否为素数,数据规模很小,可用试除法.注意0,1的特殊情况.5,输出,注意大小写,换行符.2.火柴棒等式【问题描述】给n根火柴棒,问能拼出多少种形如"A+B=C"的等式.【题目类型】搜索【建议编程时间】30分钟.若某些问题未考虑到,调试20分钟.【解题分析】读入整数n,减去加号和等号需要的4根火柴.采用搜索方法,先递归枚举火柴拆分成每个数字对应根数(存在数组里),再枚举加号和等号的位置,计算对应的A,B,C,最后判断A+B=C,统计总数.输出tot,注意换行.【编程注意】注意最高位不能为零,即除非该数为零,最高位不为零.递归函数两个入口,表示当前剩余火柴根数,当前位数.枚举下一根火柴的数字,记录,递归(剩余-当前火柴,位数+1).当剩余根数为零时,枚举A,B,C的拆分方式.计算A时,先将A设为首位,若首位为零且位数大于1,则失败退出(最高位不为零)从首位+1到末位:A*=10, A+=a[i]. 字符串转为整数的常用方法.注意个数为0时的特殊处理.3.传纸条【问题描述】从m*n的矩阵中,只能向下,右两个方向走,找到两条互不相交的路径,使得两条路径上的权值之和最大.【题目类型】双线程动态规划【建议编程时间】40分钟.这里的编程时间包括调试时间.【空间复杂度】约27M,全局变量完全可承受.50*50*50*50*sizeof(int)=2.5*10^7.【解题分析】读入矩阵,注意行列.采用一个四维数组记录当前两条路走到的位置(i1,j1,i2,j2)时取得的最大值,初始化为0,表示不可能到达.(0,0,0,0)为1,最后减1输出.一个四重循环枚举两条路分别走到的位置.由于每个点均从上或左继承而来,故内部有四个if,分别表示两个点从上上,上左,左上,左左继承来时,加上当前两个点所取得的最大值.例如,f[i][j][k][l] = max{f[i][j][k][l], f[i-1][j][k-1][l] + a[i][j] + a[k][l]},表示两点均从上面位置走来.输出右下角处的最大值f[m][n][m][n],注意换行.【编程注意】在数组边界处特殊处理,避免数组越界.若待继承的点最大值为零,则停止判断,不能从这里走来.显然,非矩阵右下角的汇合点,两个位置不能重合(否则路径相交),若重合则最大值为0,不可达.4.双栈排序【问题描述】通过两个栈S1,S2,将一个给定的输入序列升序排列.定义a操作将元素压入S1栈,b操作从S1栈中取出栈顶元素,c操作将元素压入S2栈,d操作从S2栈中取出栈顶元素.求字典序最小的操作序列.【建议编程时间】贪心算法40分钟(包括调试),可得30分.【解题分析】(贪心算法,30分)1,读入序列2,若能进入S1栈,则执行a操作,进入S1栈;重复执行b操作,将S1栈中当前元素弹出,直到不可行为止.3,若能进入S2栈(c),并将S2中符合要求的元素弹出(d),直到不可行.4,若两栈均无法进入,失败退出5,输出操作序列【判断是否能进栈】若当前元素小于栈顶元素,则进栈,栈元素个数自增;否则不能进栈.因为栈中必须保持降序,这样才能保证依次输出时升序.【判断是否能出栈】用全局变量表示当前取出的最大元素.若栈内元素个数不为零,且当前栈顶元素等于最大元素+1(因为元素是1-n依次取出的),则取出该元素,最大元素自增,栈元素个数自减.【正确解题分析】(转载,感谢提供解题方法的大牛)这道题大概可以归结为如下题意:有两个队列和两个栈,分别命名为队列1(q1),队列2(q2),栈1(s1)和栈2(s2).最初的时候,q2,s1和s2都为空,而q1中有n个数(n<=1000),为1~n的某个排列.现在支持如下四种操作:a操作,将q1的首元素提取出并加入s1的栈顶.b操作,将s1的栈顶元素弹出并加入q1的队列尾.c操作,将q1的首元素提取出并加入s2的栈顶.d操作,将s2的栈顶元素弹出并加入q1的队列尾.请判断,是否可以经过一系列操作之后,使得q2中依次存储着1,2,3,…,n.如果可以,求出字典序最小的一个操作序列.这道题的错误做法很多,错误做法却能得满分的也很多,这里就不多说了.直接切入正题,就是即将介绍的这个基于二分图的算法.注意到并没有说基于二分图匹配,因为这个算法和二分图匹配无关.这个算法只是用到了给一个图着色成二分图.第一步需要解决的问题是,判断是否有解.考虑对于任意两个数q1[i]和q1[j]来说,它们不能压入同一个栈中的充要条件是什么(注意没有必要使它们同时存在于同一个栈中,只是压入了同一个栈).实际上,这个条件p是:存在一个k,使得i<J<K且Q1[K]<Q1[I]Q1[I],这显然是不正确的.接下来证明必要性.也就是,如果两个数不可以压入同一个栈,那么它们一定满足条件p.这里我们来证明它的逆否命题,也就是"如果不满足条件p,那么这两个数一定可以压入同一个栈." 不满足条件p有两种情况:一种是对于任意i<J<K且Q1[I]Q1[I];另一种是对于任意IQ1[J].第一种情况下,很显然,在q1[k]被压入栈的时候,q1[i]已经被弹出栈.那么,q1[k]不会对q1[j]产生任何影响(这里可能有点乱,因为看起来,当q1[j]<Q1[K]的时候,是会有影响的,但实际上,这还需要另一个数R,满足J<K<R且Q1[R]<Q1[J]<Q1[K],也就是证明充分性的时候所说的情况…而事实上我们现在并不考虑这个R,所以说Q1[K]对Q1[J]没有影响).第二种情况下,我们可以发现这其实就是一个降序序列,所以所有数字都可以压入同一个栈. 这样,原命题的逆否命题得证,所以原命题得证.此时,条件p为q1[i]和q1[j]不能压入同一个栈的充要条件也得证.这样,我们对所有的数对(i,j)满足1<=i<J<=N,检查是否存在I<J<K满足P1[K]<P1[I]二分图的两部分看作两个栈,因为二分图的同一部分内不会出现任何连边,也就相当于不能压入同一个栈的所有结点都分到了两个栈中.此时我们只考虑检查是否有解,所以只要O(n)检查出这个图是不是二分图,就可以得知是否有解.此时,检查有解的问题已经解决.接下来的问题是,如何找到字典序最小的解.实际上,可以发现,如果把二分图染成1和2两种颜色,那么结点染色为1对应当前结点被压入s1,为2对应被压入s2.为了字典序尽量小,我们希望让编号小的结点优先压入s1.又发现二分图的不同连通分量之间的染色是互不影响的,所以可以每次选取一个未染色的编号最小的结点,将它染色为1并从它开始DFS染色,直到所有结点都被染色为止.这样,我们就得到了每个结点应该压入哪个栈中.接下来要做的,只不过是模拟之后输出序列啦~还有一点小问题,就是如果对于数对(i,j),都去枚举检查是否存在k使得p1[k]<P1[I]<P1[J]的话,那么复杂度就升到了O(N^3).解决方法就是,首先预处理出数组B,B[I]表示从P1[I]到P1[N]中的最小值.接下来,只需要枚举所有数对(I,J),检查B[J+1]是否小于P1[I]且P1[I]是否小于P1[J]就可以了.附代码(除去注释不到100行),带注释.代码中的a数组对应文中的队列p1.已经过掉所有标准数据,以及5 7 2 4 1 6 3这组让很多贪心程序挂掉的数据~#includeusing namespace std;const int nn = 1002, mm = nn * 2, inf = ;int n, tot, now;int a[nn], b[nn], head[nn], color[nn];int adj[mm], next[mm];int stack[3][nn];bool result;void addEdge(int x, int y) //加边{++ tot;adj[tot] = y;next[tot] = head[x];head[x] = tot;}bool dfs(int i) //DFS染色,检查图是否是二分图的经典算法{int temp = head[i];while (temp) //邻接表,检查每一条边{if (! color[adj[temp]]) //如果与当前结点的结点还未染色{color[adj[temp]] = 3 - color[i]; //进行染色dfs(adj[temp]); //DFS}if (color[adj[temp]] == color[i]) return false;//如果两个相邻结点染色相同,说明此图不是二分图,返回无解temp = next[temp];}return true;}int main(){freopen("twostack.in", "r", stdin);freopen("twostack.out", "w", stdout);//输入scanf("%d", &n);for (int i = 1; i = 1; -- i) b[i] = min(b[i + 1], a[i]); //"min" in STL//枚举数对(i,j)并加边tot = 0;for (int i = 1; i <= n; ++ i)for (int j = i + 1; j <= n; ++ j)if (b[j + 1] < a[i] && a[i] < a[j]){addEdge(j, i);}//DFS染色memset(color, 0, sizeof(color));result = true;for (int i = 1; i <= n; ++ i) //每次找当前未染色的编号最小的结点,并染颜色1 if (! color[i]) //当前位置尚未被染色{color[i] = 1;if (! dfs(i)) //染色时出现矛盾,此时图不是一个二分图,即无法分配到两个栈中{result = false; //记录无解break;}}if (! result) //无解printf("0");else //有解{//模拟求解now = 1;for (int i = 1; i <= n; ++ i){//将当前数字压入对应的栈if (color[i] == 1)printf("a ");elseprintf("c ");stack[color[i]][0] ++;stack[color[i]][stack[color[i]][0]] = a[i]; //this will work even if stack[1][0] = 0//循环检查,如果可以的话就从栈顶弹出元素while (stack[1][stack[1][0]] == now || stack[2][stack[2][0]] == now){if (stack[1][stack[1][0]] == now){printf("b ");stack[1][0] --;}else if (stack[2][stack[2][0]] == now){stack[2][0] --;}now ++;}}}第四题上述程序转载自.结语以上四道题全部做完,需要约140分钟,距离三小时的时限还有40分钟,可以编一些特殊的,极端的数据对程序进行测试.这个阶段要做好源代码备份,除非发现重大问题,不要修改程序源代码,尤其在离终场10分钟以内时,因为此时头脑紧张,极易改错.这样下来,330分不是大问题,在河北省就进入省队了.但是,很多平时成绩不错的大牛考试时粗心大意,丢分现象十分严重.这次考试的题目很水,更考察选手的细心认真程度.真正的高手不仅会做难题,水题也能保证不出错.只有不出错,才能省队,因为第四题竞赛时几乎没人想出正确解法;只有保证错误不足半道,才能一等奖,因为河北省一等奖分数线是280分.实际上,对于如此普及组难度的水题,即使实力一般,也可能拿到不错的成绩.希望NOIP2008成功的同学总结经验,再接再厉,创造更好的成绩;NOIP失利的同学不要气馁,总结教训,认真细致,下次再争取.NOIP2008复赛提高组第四题 twostack 解题报告(2008-11-16 15:19:06)分类:编程经验标签:noip2008复赛提高组普及组 twostack 第四题 noip复测数据能AC的题解:#include <string>#include <fstream>using namespace std;ifstream fin ("twostack.in");ofstream fout ("twostack.out");string ways[1000],*pw=ways;int n;int queue[1001];int stack1[500][1001],stack2[500][1001];int *p1[500],*p2[500];bool cmp(string a,string b){int len=(a.length()<b.length())?a.length():b.length();for (int i=0;i<len;i++) if (a[i]!=b[i]) return a[i]<b[i];return a.length()<b.length();}void qsort(string *low,string *high){string *i=low,*j=high;string mid=*(low+(high-low)/2);while (i<=j){while (cmp(*i,mid)) i++;while (cmp(mid,*j)) j--;if (i<=j){string tmp=*i;*i=*j;*j=tmp;i++;j--;}}if (i<high) qsort(i,high);if (j>low) qsort(low,j);}bool isMin(int num,int *begin,int *end){for (;begin<=end;begin++) if(*begin<num) return false;return true;}void run(int iP1,int iP2,int i,string way){p1[iP1]=stack1[iP1];p2[iP2]=stack2[iP2];int *p=stack1[iP1-1];for (;p<p1[iP1-1];p++) *(p1[iP1]++)=*p;p=stack2[iP2-1];for (;p<p2[iP2-1];p++) *(p2[iP2]++)=*p;while (i<n){if (p1[iP1]==stack1[iP1]) //stack1[iP1]为空{*(p1[iP1]++)=queue[i++]; //操作away+=" a";continue;}else if (*(p1[iP1]-1)>queue[i]) //stack1[iP1]栈顶元素大于当前元素{if (p2[iP2]!=stack2[iP2] && *(p2[iP2]-1)>queue[i] && *(p1[iP1]-1)>*(p2[iP2]-1) && !isMin(queue[i],&queue[i+1],&queue[n-1])) //如果能压stack2[iP2]则DFS 这个看完数据才想到,失策。

noip普及组复赛答案

noip普及组复赛答案

noip普及组复赛答案【篇一:noip普及组复赛入门测试(答案+测试数据)】class=txt>新龟兔赛跑比赛即将举行,此次龟兔赛跑比赛的规则与以往有所不同,不再考察兔子和乌龟谁在最短的时间内跑完规定的路程,而是考察谁在规定时间内跑的路程更长,且兔子和乌龟跑步都是匀速的。

由于兔子的坏习惯,它总喜欢把比赛的总时间t小时中的k小时拿来睡觉。

现在给你比赛的总时间t、兔子的睡觉时间k、兔子的速度u、乌龟的速度v,需要你求出该次比赛谁最后获胜。

输入第一行为一个整数x,表示有x组输入数据。

每组数据只有一行,包括4个数t、k、u、v (1 ≤ t≤ 300,0 ≤ k ≤ t,1 ≤ u ≤ 100,1 ≤ v ≤ 100)。

对于每组数据,输出只有一个数,如果兔子获胜则输出-1,如果乌龟获胜则输出1,如果同时到达则输出0。

允许输入一组数后立即输出对应的结果。

样例输入:21 12 16 2 6 3样例输出:1-1varv,u,t,k,n,i:integer;beginreadln(n);for i:=1 to n do beginreadln(t,k,u,v);if v*tu*(t-k) then writeln(1);if v*tu*(t-k) then writeln(-1);if v*t=u*(t-k) then writeln(0);end;end.1、输入:26 2 6 28 6 8 2输出:-12、输入:2300 280 60 20120 0 12 13输出:113、输入:3100 20 50 30100 50 45 25100 80 27 17输出:-1114、输入:3150 77 29 23127 11 22 13139 22 13 7输出:1-1-1二、小球路程(文件名:xqlc.pas )已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,??。

每次弹起的高度都是上一次高度的一半。

noip2008普及组复赛试题(附题解)

noip2008普及组复赛试题(附题解)

全国信息学奥林匹克联赛(NOIP2008)复赛普及组注意事项:1、文件名(程序名和输入输出文件名)必须使用小写。

2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。

各省在自测时可根据具体配置调整时限。

1.ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。

ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

识别码的计算方法如下:首位数字乘以1加上次位数字乘以2......以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。

例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2, (9)再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

NOIP2008提高组前三题解题报告

NOIP2008提高组前三题解题报告

NOIP2008提高组前三题解题报告[日期:2008-11-18] 来源:作者:张恩权[字体:大中小]NOIP2008提高组前三题解题报告1.笨小猴基本的字符串处理,细心一点应该没问题的,不过判断素数时似乎需要考虑下0和1的情况。

参考程序:program word;constinp='word.in';oup='word.out';vari,j,k,min,max:longint;s:string;ch:char;f:array['a'..'z'] of integer;//记录每个字符出现的次数procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;function judge(k:longint):boolean;//判断素数,需考虑0和1的情况vari:longint;beginif (k=0) or (k=1) then exit(false);for i:=2 to trunc(sqrt(k)) doif k mod i = 0 then exit(false);exit(true);end;beginflink;readln(s);fillchar(f,sizeof(f),0);for i:= 1 to length(s) do //统计每个字符出现的次数 inc(f[s[i]]);min:=1000; max:=0;for ch:= 'a' to 'z' do//统计最大和最小beginif ( f[ch]<>0 ) and (f[ch]>max) thenmax:=f[ch];if ( f[ch]<>0 ) and (f[ch]<min) thenmin:=f[ch];end;k:=max-min;if judge(k) then//输出beginwriteln('Lucky Word');write(k);endelsebeginwriteln('No Answer');write(0);end;fclose;end.2.火柴棒等式预处理下,然后枚举、剪枝,范围稍微开大点,弄到2000似乎足够了,剪枝后不会超时的。

NOIP2008普及组复赛试题与解题报告

NOIP2008普及组复赛试题与解题报告

NOIP 2008普及组解题报告一、ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。

ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

识别码的计算方法如下:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。

例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

【输入输出样例1】isbn.in0-670-82162-4isbn.outRight【输入输出样例2】isbn.in0-670-82162-0isbn.out0-670-82162-4【试题分析】基础字符串处理题,心细一点的基本都能得满分。

【参考程序】program isbn;constinp='isbn.in';oup='isbn.out';vari,j,k,ans:longint;s:string;ch:char;procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;beginflink;readln(s);// 输入字符串j:=0;i:=1;ans:=0;while j<9 dobeginif s[i] in ['0'..'9'] then//如果是数字,那么累加到ans中,共9个数字begininc(j);inc(ans,(ord(s[i])-ord('0'))*j);end;inc(i);end;ans:=ans mod 11;计算识别码if ans=10 then ch:='X' else ch:=chr(ord('0')+ans);//把识别码转换成字符,方便输出 if s[length(s)]=chthen write('Right')else write(copy(s,1,12)+ch);//输出正确的识别码fclose;end.二、排座椅(seat.pas/c/cpp)【问题描述】上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。

NOIP2008南海区普及组复赛模拟测试题

NOIP2008南海区普及组复赛模拟测试题

NOIP2008南海区普及组复赛模拟测试题㈠(测试时间:2008年11月1日上午)注意事项:1.严格按照题目要求的格式进行输入、输出,否则严重影响得分。

2.题目测试数据有严格时间限制,超时不得分。

3.输入文件格式不用判错;输入输出文件名均已给定,不用键盘输入。

4.程序完成后,要按指定的提交文件名编译成EXE文件,评卷时以EXE文件为准。

5.选手要同时将EXE文件和源程序(PAS)提交。

6.全卷400分,三小时完成。

第一题奶牛式乘法输入文件: cowmul.in输出文件: cowmul.out问题描述:做厌了乘法计算题的贝茜,自创了一种新的乘法运算法则。

在这套法则里,A*B等于一个取自A、一个取自B的所有数字对的乘积的和。

比方说,123*45等于1*4 + 1*5 + 2*4 + 2*5 + 3*4 + 3*5 = 54。

对于2个给定的数A、B(1 < = A, B < = 1,000,000,000),你的任务是,用新的乘法法则计算A*B 的值。

输入格式:输入文件只有一行,是2个用空格隔开的整数:A、B输出格式:输出文件共一行,输出1个整数,即新的乘法法则下A*B的值输入样例(cowmul.in):123 45输出样例(cowmul.out):54第二题晚餐队列安排输入文件: dining.in输出文件: dining.out问题描述:为了避免餐厅过分拥挤,FJ要求奶牛们分2批就餐。

每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第2批就餐的奶牛排在队尾,队伍的前半部分则由设定为第1批就餐的奶牛占据。

由于奶牛们不理解FJ的安排,晚饭前的排队成了一个大麻烦。

第i头奶牛有一张标明她用餐批次D_i(1 < = D_i < = 2)的卡片。

虽然所有N(1 < = N < = 30,000)头奶牛排成了很整齐的队伍,但谁都看得出来,卡片上的号码是完全杂乱无章的。

1995-2008 历届NOIP试题及详解

1995-2008 历届NOIP试题及详解

N1=1
Q
排列方案: R
⑤ 排数列据总输数入=:6 N=6 R
P1=R
N1=2 R
P2=Y Q
N2=1 R
R
⑥排数列据方输案入::N=R12 R
Y
R
排列总数=12 P1=RR R N1= 3 Y

P2=RB R N2=2
Y
P3=Y R N3R=1
Y
Q
RR
Y
排列方案:
RR
<8> 本题排共列40总分数(:12%+14%R+14R%) R
BBB
RR
N
P1(颜色,为一个字母) N1(灯的数量)
P2
N2
……
Q(结束标记,Q 本身不是灯的颜色)
程序要求:求出一种顺序的排列方案及排列总数。
<3> 设有一个四层的积木块,1~4 层积木块的数量依次为:5,6,7,8
如下图所示放置:
8 15 8 5 16 9 14
23414326 其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出
输出: A=(3,2,1,0,4,5,6)
<5> 本题共 30 分(10%+10%+10%)
① 数据输入: N=6
P1=R
N1=1
Q
排列方案: R ② 排数列据总输数入=:6 N=6 R
P1=R
NR1=2
P2=Y
N2=1 R
Q
R
排列方案: R ③ 排数列据总输数入=:12N=1R2
P1=RR
R
Y
R R N1= 3
(10)10=1(1 110010)9 2 8 7 6

NOIP2008普及组复赛试题

NOIP2008普及组复赛试题

全国信息学奥林匹克联赛(NOIP2008)复赛普及组一.题目概览中文题目名称ISBN号码排座椅传球游戏立体图英文题目名称isbn seat ball drawing可执行文件名isbn seat ball drawing输入文件名isbn.in seat.in ball.in drawing.in输出文件名isbn.out seat.out ball.out drawing.out每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 10每个测试点分值10 10 10 10比较方式全文比较全文比较全文比较全文比较题目类型传统传统传统传统二.提交源程序文件名对于pascal语言isbn.pas seat.pas ball.pas drawing.pas对于C语言isbn.c seat.c ball.c drawing.c对于C++语言isbn.cpp seat.cpp ball.cpp drawing.cpp三.编译命令(不包含任何优化开关)对于pascal语言fpc isbn.pas fpc seat.pas fpc ball.pas fpc drawing.pas对于C语言gcc –o isbnisbn.c gcc –o seatseat.c gcc –o ballball.c gcc –o drawingdrawing.c对于C++语言g++ –o isbnisbn.cpp g++ –o seatseat.cpp g++ –o ballball.cpp g++ –odrawingdrawing.cpp四.运行内存限制运行内存上限50M 50M 50M 50M注意事项:1、文件名(程序名和输入输出文件名)必须使用小写。

2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP 2008普及组解题报告一、ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。

ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

识别码的计算方法如下:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。

例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

【输入输出样例1】isbn.in0-670-82162-4isbn.outRight【输入输出样例2】isbn.in0-670-82162-0isbn.out0-670-82162-4【试题分析】基础字符串处理题,心细一点的基本都能得满分。

【参考程序】program isbn;constinp='isbn.in';oup='isbn.out';vari,j,k,ans:longint;s:string;ch:char;procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;beginflink;readln(s);// 输入字符串j:=0;i:=1;ans:=0;while j<9 dobeginif s[i] in ['0'..'9'] then//如果是数字,那么累加到ans中,共9个数字begininc(j);inc(ans,(ord(s[i])-ord('0'))*j);end;inc(i);end;ans:=ans mod 11;计算识别码if ans=10 then ch:='X' else ch:=chr(ord('0')+ans);//把识别码转换成字符,方便输出 if s[length(s)]=chthen write('Right')else write(copy(s,1,12)+ch);//输出正确的识别码fclose;end.二、排座椅(seat.pas/c/cpp)【问题描述】上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。

不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。

同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。

于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。

在该方案下,上课时交头接耳的学生对数最少。

【输入】输入文件seat.in的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。

接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优方案的唯一性。

【输出】输出文件seat.out共两行。

第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。

第二行包含L个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(行尾没有空格)。

【输入输出样例】seat.in4 5 1 2 34 2 4 32 3 3 32 5 2 4seat.out22 4【试题分析】用的是赛前集训时提到的贪心,当时说某些题目用贪心可以得部分分,但是本题贪心可以得满分的。

当然本题的贪心需要预处理下,开2个一维数组,row[i]录如果在第i行加通道,可以分割多少对调皮学生,col[i]记录如果在第j列加通道,可以分割多少对调皮学生,最后贪心法输出分割学生最多的前K 行和前L列。

【参考程序】program seat;constinp='seat.in';oup='seat.out';varflag,m,n,k,l,d,i,j,x,y,x1,y1:longint;tmp,col,row:array[1..1000] of longint;s,s1:ansistring;procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;function min(a,b:longint):longint;beginif a<b then exit(a); exit(b);end;procedure qsort(m,n:Longint);//快排vari,j,k,t:longint;begini:=m; j:=n; k:=tmp[(i+j) shr 1];repeatwhile tmp[i]>k do inc(i);while tmp[j]<k do dec(j);if i<=j thenbegint:=tmp[i]; tmp[i]:=tmp[j]; tmp[j]:=t; inc(I); dec(J);end;until i>j;if m<j then qsort(m,j);if I<n then qsort(i,n);end;beginreadln(m,n,k,L,d);fillchar(row,sizeof(row),0);fillchar(col,sizeof(col),0);for i:= 1 to d do //统计在每行、每列添加通道可以分割的学生数beginreadln(x,y,x1,y1);if (x=x1)then inc(col[min(y,y1)])else inc(row[min(x,x1)]);end;j:=0;for i:= 1 to m do //把能没个行通道分割的学生数加入tmp数组,准备排序beginif row[i]>0 thenbegininc(j);tmp[j]:=row[i];end;end;qsort(1,j);//对tmp数组排序flag:=tmp[k];//flag为前K项的最小值i:=1; j:=0;while (i<=n) and (j<k) dobeginif row[i]>=flag then //如果该行能分割的人数不少于flag,说明此处可以添加通道 beginwrite(i);inc(j);if j<>k then write(' ');end;inc(i);end;writeln;//下面是求列通道,思想同上for i:= 1 to n dobeginif col[i]>0 thenbegininc(j);tmp[j]:=col[i];end;end;qsort(1,j);flag:=tmp[L];i:=1; j:=0;while (i<=m) and (j<L) dobeginif col[i]>=flag thenbeginwrite(i);inc(j);if j<>L then write(' ');end;inc(i);end;fclose;end.三、传球游戏(seat.pas/c/cpp)【问题描述】上体育课的时候,小蛮的老师经常带着同学们一起做游戏。

这次,老师带着同学们一起做传球游戏。

游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m 次以后,又回到小蛮手里。

两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。

比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

【输入】输入文件ball.in共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。

【输出】输出文件ball.out共一行,有一个整数,表示符合题意的方法数。

相关文档
最新文档