奖学金pascal程序

题意

把总分排序


分析

先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面


var
a,t,p:array[0..300]of longint;
n,i,x,y,j:longint;
procedure kp(l,r:longint);
var
i,j,mid:longint;
begin
    if l>=r then exit;
    i:=l;j:=r;mid:=t[(l+r) div 2];
    repeat
         while t[i]>mid do inc(i);
         while t[j]<mid do dec(j);
         if (t[i]<t[j])or(t[i]=t[j])and(a[i]<a[j])or(t[i]=t[j])and(a[i]>a[j])and(p[i]>p[j]) then
         begin
             a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
             t[0]:=t[i];t[i]:=t[j];t[j]:=t[0];
             p[0]:=p[i];p[i]:=p[j];p[j]:=p[0];
             inc(i);dec(j);
         end;
    until(i>j);
    kp(l,j);
    kp(i,r);
end;
begin
    readln(n);
    for i:=1 to n do
    begin
        readln(a[i],x,y);
        t[i]:=a[i]+x+y;
        p[i]:=i;
    end;
    //kp(1,n);
    for i:=1 to n-1 do
    begin
        for j:=i+1 to n do
        if (t[i]<t[j])or(t[i]=t[j])and(a[i]<a[j])or(t[i]=t[j])and(a[i]>a[j])and(p[i]>p[j]) then
         begin
             a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
             t[0]:=t[i];t[i]:=t[j];t[j]:=t[0];
             p[0]:=p[i];p[i]:=p[j];p[j]:=p[0];
         end;
    end;
    for i:=1 to 5 do
    writeln(p[i],' ',t[i]);
end.

posted @ 2017-01-13 21:35  银叶草  阅读(97)  评论(0编辑  收藏  举报
Live2D