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

var a:array[1..100] of integer;
    b:array[1..1000] of integer;
    s,i,n:integer;
begin
    assign(input,'random.in'); reset(input);
    assign(output,'random.out'); rewrite(output);
    readln(n);
    for i:=1 to n do read(a[i]);
    readln;
    for i:=1 to n do b[a[i]]:=1;
    s:=0;
    for i:=1 to 1000 do if b[i]=1 then inc(s);
    writeln(s);
    for i:=1 to 1000 do if b[i]=1 then write(i,' ');
    writeln;
    close(input);
    close(output);
end.

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

var
N,x,j,temp:integer;
tf:boolean;
a:array[1..10000] of integer;
begin
    assign(input,'carry.in');
    assign(output,'carry.out');
    reset(input);
    rewrite(output);
    read(n);
    for x:=1 to n do read(a[x]);
    j:=0;
    tf:=true;
    while tf do
    begin
    tf:=false;
    for x:=1 to n-1 do
    if a[x]>a[x+1] then
        begin
        temp:=a[x];
        a[x]:=a[x+1];
        a[x+1]:=temp;
        j:=j+1;
        tf:=true;
        end;
    end;
    write(j);
    close(input);
    close(output);
end.

众数(masses.pas) 【问题描述】 由文件给出N个1到30000间无序数正整数,其中1≤N≤10000,同一个正整数可能会出现多次,出现次数最多的整数称为众数。求出它的众数及它出现的次数。 【输入格式】 输入文件第一行是正整数的个数N,第二行开始为N个正整数。 【输出格式】 输出文件有若干行,每行两个数,第1个是众数,第2个是众数出现的次数。 【输入样例】masses.in 12 2  4  2  3  2  5  3  7  2  3  4  3 【输出样例】masses.out 2   4 3   4

var
n,x,j:integer;
a:array[1..10000] of 1..30000;
b:array[1..30000] of 1..10000;
begin
    assign(input,'masses.in');
    assign(output,'masses.out');
    reset(input);
    rewrite(output);
    read(n);
    for x:=1 to n do read(a[x]);
    for x:=1 to n do b[a[x]]:=b[a[x]]+1;
    j:=0;
    for x:=1 to 30000 do
    if b[x]>j then j:=b[x];
    for x:=1 to 30000 do
    if b[x]=j then
        begin
        write(x:6,j:6);
        writeln;
        end;
    close(input);
    close(output);
end.

军事机密(Secret.pas) 【问题描述】 军方截获的信息由n(n<=30000)个数字组成,因为是敌国的高端秘密,所以一时不能破获。最原始的想法就是对这n个数进行小到大排序,每个数都对应一个序号,然后对第i个是什么数感兴趣,现在要求编程完成。 【输入格式】 第一行n,接着是n个截获的数字,接着一行是数字k,接着是k行要输出数的序号。 【输出格式】 k行序号对应的数字。 【输入样例】Secret.in 5 121  1  126  123   7 3 2 4 3 【输出样例】Secret.out 7 123 121

var
N,x,j,temp:integer;
tf:boolean;
a:array[1..30000] of integer;
begin
    assign(input,'Secret.in');
    assign(output,'Secret.out');
    reset(input);
    rewrite(output);
    read(n);
    for x:=1 to n do read(a[x]);
    tf:=true;
    while tf do
    begin
    tf:=false;
    for x:=1 to n-1 do
    if a[x]>a[x+1] then
        begin
        temp:=a[x];
        a[x]:=a[x+1];
        a[x+1]:=temp;
        tf:=true;
        end;
    end;
    while not(eof) do
    begin
        read(j);
        write(a[j]);
        writeln;
    end;
    close(input);
    close(output);
end.

Pascal:排序算法,习题
https://Mundnaity.moe/post/pascal_chap_A2_ex
作者
申酉和风
发布于
2016-10-30
许可协议