zoukankan      html  css  js  c++  java
  • 排序算法练习(一)

    排序算法_众数

    AYYZOJ p1436

    分析:桶排序,直接统计,可能有多个众数。

     1 program p1436;
     2 var
     3  n,i,max:longint;
     4  a:array[1..30000] of longint;
     5 begin
     6  max:=-maxint;
     7  readln(n);
     8  for i:=1 to n do
     9   begin
    10    read(n);
    11    inc(a[n]);
    12   end;
    13  for i:=1 to 30000 do
    14   if a[i]>0 then
    15    if a[i]>max then max:=a[i];
    16   for i:=1 to 30000 do
    17    if a[i]=max then writeln(i,' ',a[i]);
    18 end.
    我的程序
     1 var
     2   a:array[1..30000] of integer;
     3   max,i,j,n,m:integer;
     4 begin
     5   readln(n);
     6   max:=0;
     7   for i:=1 to n do
     8     begin
     9       read(m);
    10       inc(a[m]);
    11       if max<a[m] then max:=a[m];
    12     end;
    13   for i:=1 to 30000 do
    14     if a[i]=max then writeln(i,' ',a[i]);
    15 end.
    老师给的标程

    排序算法_军事机密

    AYYZOJ p1438

    分析:数据规模万级的,用快排或归并排序

    想当初我真是太天真了,给你们看看我的冒泡80分程序:

     1 program p1438;
     2 var
     3   a,b:array[1..30000] of longint;
     4   n,i,j,t,k:longint;
     5   flag:boolean;
     6 begin
     7  readln(n);
     8  for i:=1 to n do read(a[i]);
     9  readln(k);
    10  for i:=1 to k do readln(b[i]);
    11   for j:=1 to n-1 do begin
    12     flag:=true;
    13     for i:=1 to n-j do
    14       if a[i]>a[i+1] then begin
    15         t:=a[i];a[i]:=a[i+1];a[i+1]:=t;
    16         flag:=false;
    17       end;
    18     if flag then break;
    19   end;
    20   t:=0;
    21   repeat
    22    inc(t);
    23    writeln(a[b[t]]);
    24   until t=k;
    25 end.
    TLE的冒泡
     1 var
     2   a:array[1..30000] of longint;
     3   n,i,k,m:longint;
     4 procedure qsort(l,r:longint);
     5   var
     6     tmp,i,j,mid:longint;
     7   begin
     8     i:=l;
     9     j:=r;
    10     mid:=a[(i+j)div 2];
    11     repeat
    12       while a[i]<mid do inc(i);
    13       while a[j]>mid do dec(j);
    14       if i<=j then
    15         begin
    16           tmp:=a[i];a[i]:=a[j];a[j]:=tmp;
    17           inc(i);
    18           dec(j);
    19         end;
    20     until i>j;
    21     if l<j then qsort(l,j);
    22     if i<r then qsort(i,r);
    23   end;
    24 begin
    25   readln(n);
    26   for i:=1 to n do read(a[i]);
    27   qsort(1,n);
    28   readln(k);
    29   for i:=1 to k do begin
    30     readln(m);
    31     writeln(a[m]);
    32   end;
    33 end.
    AC的快排

    排序算法_输油管道

    AYYZOJ p1439

    分析:中位数问题,中位数(Median)统计学名词,是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据。定义:一组数据按从小到大(或从大到小)的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数)。

            把油井按y坐标排序,求出序列中间位置的元素值,即管道铺设的位置,然后统计各油井到该管道的位置。(好像没有证明。。)

     1 program p1439;
     2 var
     3  n,i,j:longint;
     4  k,s:real;
     5  a:array[1..100000] of longint;
     6   procedure sort(l,r:longint);
     7   var
     8     tmp,mid:longint;
     9   begin
    10     i:=l;
    11     j:=r;
    12     mid:=a[(i+j)div 2];
    13     repeat
    14       while a[i]<mid do inc(i);
    15       while a[j]>mid do dec(j);
    16       if i<=j then
    17         begin
    18           tmp:=a[i];a[i]:=a[j];a[j]:=tmp;
    19           inc(i);
    20           dec(j);
    21         end;
    22     until i>j;
    23     if l<j then sort(l,j);
    24     if i<r then sort(i,r);
    25   end;
    26 begin
    27  readln(n);
    28  for i:=1 to n do
    29   readln(k,a[i]);
    30   sort(1,n);
    31   if odd(n) then k:=a[(n div 2+1)]
    32    else k:=(a[(n div 2)]+a[(n div 2+1)])/2;
    33    for i:=1 to n do
    34     s:=s+abs(a[i]-k);writeln(trunc(s));
    35 end.
    我的程序
     1 type
     2   arr=array[1..10000] of integer;
     3 var
     4   x,y:arr;
     5   ans:longint;
     6   i,j,n,p:integer;
     7 procedure sort(l,r:longint;var a:arr);
     8   var
     9     tmp,i,j,mid:longint;
    10   begin
    11     i:=l;
    12     j:=r;
    13     mid:=a[(i+j)div 2];
    14     repeat
    15       while a[i]<mid do inc(i);
    16       while a[j]>mid do dec(j);
    17       if i<=j then
    18         begin
    19           tmp:=a[i];a[i]:=a[j];a[j]:=tmp;
    20           inc(i);
    21           dec(j);
    22         end;
    23     until i>j;
    24     if l<j then sort(l,j,a);
    25     if i<r then sort(i,r,a);
    26   end;
    27 begin
    28   readln(n);
    29   for i:=1 to n do readln(x[i],y[i]);
    30   sort(1,n,y);
    31   p:=y[n div 2+1];
    32   for i:=1 to n do
    33     ans:=ans+abs(y[i]-p);
    34   writeln(ans);
    35 end.
    老师的程序

    排序算法_谁是组长

    AYYZOJ p1442

    COGS p979

    分析:不能用桶排,nlongint。可以快排,然后统计得票最多的。

     1 var
     2   a:array[1..10000] of longint;
     3   n,m,i,k,ans,max:longint;
     4 procedure qsort(l,r:longint);
     5   var
     6     tmp,i,j,mid:longint;
     7   begin
     8     i:=l;
     9     j:=r;
    10     mid:=a[(i+j)div 2];
    11     repeat
    12       while a[i]<mid do inc(i);
    13       while a[j]>mid do dec(j);
    14       if i<=j then
    15         begin
    16           tmp:=a[i];a[i]:=a[j];a[j]:=tmp;
    17           inc(i);
    18           dec(j);
    19         end;
    20     until i>j;
    21     if l<j then qsort(l,j);
    22     if i<r then qsort(i,r);
    23   end;
    24 begin
    25   readln(n,m);
    26   for i:=1 to m do read(a[i]);
    27   qsort(1,m);
    28   k:=1; max:=1; ans:=a[1];
    29   for i:=2 to m do begin
    30     if a[i]=a[i-1] then
    31       begin
    32         inc(k);
    33         if max<k then begin max:=k; ans:=a[i];end;
    34       end
    35     else k:=1;
    36   end;    
    37   if max > m div 2 then writeln(ans)
    38   else writeln(-1);
    39 end.
    参考程序

    这题WA了一次,原因是少了“k:=1;max:=1;ans:=a[1];”中的“ans:=a[1];”,其中有一个数据是   1      1      只有一人不赋初值导致输出0,还是考虑不周全啊。

  • 相关阅读:
    Windows-Windows 下使用 Linux 系统(WSL)
    Windows
    多校3 1002 RGCDQ
    三分 Error Curves
    Equation Again 最大化最小值
    Monthly Expense
    Hamburgers 假定解是否可行
    多校2 1002 Buildings
    UVa 10881 Piotr’s Ants
    多校1 Assignment(枚举 二分 rmq) 1002
  • 原文地址:https://www.cnblogs.com/vacation/p/5180570.html
Copyright © 2011-2022 走看看