(完整word版)排序例题_第1页
(完整word版)排序例题_第2页
免费预览已结束,剩余9页可下载查看

下载本文档

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

文档简介

1、1、明明的随机数( Noip2006) 【问题描述】明明想在学校中请一些同学一起做一项问卷调查, 为了实验的客观性, 他先用计 算机生成了 N 个 1 到 1000 之间的随机整数(NK100),对于其中重复的数字, 只保留一个, 把其余相同的数去掉, 不同的数对应着不同的学生的学号。 然后再 把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成 “去重”与“排序”的工作。【输入文件】输入文件 random.in 有 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数: N 第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。【输出文件】输出文件 random.

2、out 也是 2 行,第 1 行为 1 个正整数 M 表示不相同的随机数 的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机 数。【输入样例】1020 40 32 67 40 20 89 300 400 15【输出样例】815 20 32 40 67 89 300 400【参考程序】/By LYLtimvar n,s:byte;i,min,max,x:word;b:array1.1000of boolean;beginassign(input,random.in);reset(input);assign(output,random.out);rewrite(outp

3、ut);readln(n);fillchar(b,sizeof(b),false);min:=1000;max:=0;s:=0;for i:=1 to n dobeginread(x);bx:=true;if xmax then max:=x;end;close(input);for i:=min to max do if bi then inc(s);writeln(s);for i:=min to max do if bi then write(i, );close(output);end.2、车厢重组( carry.pas )【问题描述】在一个旧式的火车站旁边有一座桥, 其桥面可以绕河中

4、心的桥墩水平旋转。 一个 车站的职工发现桥的长度最多能容纳两节车厢, 如果将桥旋转 180 度,则可以把 相邻两节车厢的位置交换, 用这种方法可以重新排列车厢的顺序。 于是他就负责 用这座桥将进站的车厢按车厢号从小到大排列。 他退休后, 火车站决定将这一工 作自动化, 其中一项重要的工作是编一个程序, 输入初始的车厢顺序, 计算最少 用多少步就能将车厢排序。【输入文件】输入文件有两行数据,第一行是车厢总数N (不大于 10000),第二行是 N 个不同的数表示初始的车厢顺序。【输出文件】一个数据,是最少的旋转次数。【输入样例】 carry .in44 3 2 1【输出样例】 carry .ou

5、t6【参考程序】/By LYLtimvar n,i,j,t:word;a:array1.10000of word;change:boolean;s:longword;beginassign(input,carry.in);reset(input); assign(output,carry.out);rewrite(output);readln(n);for i:=1 to n do read(ai);close(input);s:=0;i:=1;repeatchange:=false;for j:=1 to n-i doif ajaj+1 then begin t:=aj;aj:=aj+1;a

6、j+1:=t;change:=true; inc(s);end;until not change;end.3、众数 (masses.pas)【问题描述】由文件给出 N个 1到 30000间无序数正整数, 其中 个正整数可能会出现多次, 出现次数最多的整数称为众数。 现的次数。【输入格式】输入文件第一行是正整数的个数 N,第二行开始为【输出格式】输出文件有若干行,每行两个数,第 1 个是众数,次数。【输入样例】 masses.in122 4 2 3 2 5 3 7 2 3 4 3 【输出样例】 masses.out2434【参考程序】/By LYLtimvar n,i,x,min,max,max

7、x:word;a:array1.30000of word;beginassign(input,masses.in);reset(input);assign(output,masses.out);rewrite(output); fillchar(a,sizeof(a),0);min:=30000;max:=0;maxx:=0;readln(n);for i:=1 to n dobegin read(x); if xmax then max:=x; inc(ax);if axmaxx then maxx:=ax; end;for i:=min to max do if ai=maxx then

8、writeln(i, ,ai);close(input);close(output);end.4、第 k 小整数 (knunber.pas) 【问题描述】现有 n 个正整数,nW10000,要求出这 n 个正整数中的第 k 个最小整数 (相同大小的整数只计算一次),k 1000,正整数均小于 30000。【输入格式】第一行为 n 和 k,第二行开始为 n 个正整数的值,整数间用空格隔开。【输出格式】第 k 个最小整数的值;若无解,则输出“ NO RESUL”T 。【输入样例】 knunber.in10 3writeln(s);close(output);K NK10000,同一求出它的众数及它

9、出N 个正整数。第 2 个是众数出现的1 3 3 7 2 5 1 2 4 6【输出样例】 knunber.out3【参考程序】/By LYLtimvar n,k,i,x,min,max,s:word;b:array1.30000of boolean;beginassign(input,knumber.in);reset(input);assign(output,knumber.out);rewrite(output); fillchar(b,sizeof(b),false);min:=30000;max:=0;s:=0; readln(n,k);for i:=1 to n dobeginrea

10、d(x); bx:=true; if xmax thenmax:=x;end; close(input); for i:=min to max do begin if bi then inc(s); if s=kthen begin writeln(i); close(output); halt; end;end;writeln(NO RESULT); close(output);end.5、军事机密 (Secret.pas)【问题描述】军方截获的信息由 n(n=30000)个数字组成,因为是敌国的高端秘密,所以一 时不能破获。 最原始的想法就是对这 n 个数进行小到大排序, 每个数都对应一个

11、 序号,然后对第 i 个是什么数感兴趣,现在要求编程完成。【输入格式】第一行 n,接着是 n 个截获的数字,接着一行是数字 k,接着是 k 行要输 出数的序号。【输出格式】k 行序号对应的数字。【输入样例】 Secret.in5121 1 126 123 73243【输出样例】 Secret.out7123121【参考程序】/By LYLtimvar n,i,k:word;a:array1.30000of longword;procedure qsort(l,r:longword);var pl,pr,m,t:longword;beginpl:=l;pr:=r;m:=a(l+r)shr 1;r

12、epeatwhile aplm do dec(pr);if plpr;if pll then qsort(l,pr);end;qsortbeginmainassign(input,secret.in);reset(input);assign(output,secret.out);rewrite(output);readln(n);for i:=1 to n do read(ai);qsort(1,n);readl n(k);for i:=1 to k do begin readln(n); writeln(an); end;close(i nput);close(output);end.6、奖

13、学金(Noip2007)【问题描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生 发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从 高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同 学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名 顺序输出前 5 名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都 不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前 两行的输出数据(每行输出

14、两个数:学号、总分)是:7 2795 279这两行数据的含义是:总分最高的两个同学的学号依次是7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号 为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:5 2797 279则按输出错误处理,不能得分。【输入格式】输入文件 scholar.in 包含 n+1 行:第 1 行为一个正整数 n,表示该校参加评选的学生人数。第 2 到 n+1 行,每行有 3 个用空格隔开的数字,每个数字都在 0 到 100 之间。第 j 行的3 个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学

15、生的学号按照输入顺序编号为 1n (恰好是输入数据的行号减 1)。所给的数据 都是正确的,不必检验。【输出格式】输出文件 scholar.out 共有 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号和总分。【输入输出样例 1】scholar.i nscholar.out66 26590 67 804 26487 66 913 25878 89 912 24488 99 771 23767 89 6478 89 98【输入输出样例 2】scholar.i nscholar.out88 26580 89 892 26488 98 786 26490 67 801 25887 6

16、6 915 25878 89 9188 99 7767 89 6478 89 98【限制】50%的数据满足:各学生的总成绩各不相同100%勺数据满足:6=*=300【参考程序】/By LYLtimtypeno de=record i,ch:byte; sum:word; end; arr=array1.300of no de;var n: word;stu:arr;ma,e n:byte;procedure in it;var i:word;beg inassig n(i nput,scholar.i n);reset(i nput);readl n(n);for i:=1 to n dobe

17、gi nstui .i:=i; read(stui.ch);readl n( ma,e n);stui.sum:=stui.ch+ma+e n;end;close(i nput);en d;i nitprocedure merge(l,m,r:word);var pt,pl,pr:word;tmp:arr;beg inpt:=l;pl:=l;pr:=m+1;while(pl=m)a nd(prstupr.sum)or(stupl.sum=stupr.sum)and(stupl.ch=stupr.ch)thenbegin tmppt:=stupl; inc(pt); inc(pl); end e

18、lse begintmppt:=stupr; inc(pt); inc(pr); end;while pl=m do begin tmppt:=stupl; inc(pt); inc(pl); end;while pr=r then exit;m:=(l+r)1;mergesort(l,m);mergesort(m+1,r); merge(l,m,r);end;mergesortprocedure print;var i:byte;begin assign(output,scholar.out);rewrite(output); for i:=1 to 5 do writeln(stui.i,

19、stui.sum); close(output);end;printbeginmaininit;mergesort(1,n);print;end.7、统计数字 (Noip2007)【问题描述】某次科研调查时得到了 n 个自然数,每个数均不超过 1500000000(1.5*109 ) 已知不相同的数不超过 10000 个,现在需要统计这些自然数各自出现的次数, 按照自然数从小到大的顺序输出统计结果。【输入格式】输入文件 count.in 包含 n+1 行:第 1 行是整数 n ,表示自然数的个数。第 2n+1 行每行一个自然数。【输出格式】输出文件 count.out 包含 m 行(m 为 n

20、 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。 每行输出两个整数,分别是自然数和该数出现 的次数,其间用一个空格隔开。【输入输出样例】coun t.i ncoun t.out82 324 245 12100 2451002100【限制】40%的数据满足:1=*=100080%的数据满足:1=n=50000100%的数据满足:11;repeatwhile aplm do dec(pr);if pl=pr;if pll then qsort(l,pr);end;qsortprocedure work;var i,k:longword;beginassign(output,count.

21、out);rewrite(output);an+1:=maxlongint;k:=1;for i:=2 to n+1 doif aiai-1 then begin writeln(ai-1, ,k); k:=1;endelse inc(k);close(output);end;workbeginmaininit;qsort(1,n);work;end.分数(mark):【问题描述】 问题描述:高考分数刚刚公布,共有N个人参加考试,为了有便于填写志 愿,教育部把所有考生的成绩平均分成m档。保证n是m的倍数。 考试成绩在(k-1)*(n/m)+1名到k*(n/m)名的考生被分配到K档 (k=1,2,3m)。并列第i名的所有考生都被分配到K挡(k=1,2,3m),并列i

温馨提示

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

评论

0/150

提交评论