争分(grade)

争分

Time Limit:10000MS  Memory Limit:65536K
Total Submit:35 Accepted:9 

Description 
期中考后,市教育局统计了全县各个学校的学生总成绩,然后将全部学校按总成绩排名。(假设每个学校学生人数都相同)

Input 
(grade) 
第一行一个数n(n <= 5000),其中n代表学校的个数。 
接下来n个部分,每个部分有2行,第一行是一个字符串(长度不多于200位),代表这个学校的校名,第二行是一个数串,表示这个学校所有学生的成绩总和(长度不多于100位)。 

Output 
有n行,分别表示各个学校所有学生的成绩总和的排名顺序(按总成绩由高到低排列,若总成绩总和相同,则按校名的字典排序。)

Sample Input 


5
chenguanzhongxue
987654321
shinianzhongxue
987513641
woxizhongxue
657891356
xinchangzhongxue
971456879
zhixinzhongxue
416789426

Sample Output 


chenguanzhongxue
shinianzhongxue
xinchangzhongxue
woxizhongxue
zhixinzhongxue

Source 


算法:模拟


很裸的一道模拟题了,就是纯的双关键字排序就可以,注意成绩的前面0的情况(感觉既然是成绩前面就不应该有0,这不符合规律啊……)


program grade;

const
 maxn=5000;

type
 atp=record
  nam,sum:string;
 end;

var
 n:longint;
 a:array [0..maxn] of atp;
 
procedure init;
var
 i:longint;
begin
 readln(n);
 for i:=1 to n do
  begin
   readln(a[i].nam);
   readln(a[i].sum);
   while a[i].sum[1]='0' do delete(a[i].sum,1,1);
  end;
end;

procedure qsort(l,r:longint);
var
 i,j:longint;
 m,t:atp;
begin
 i:=l;
 j:=r;
 m:=a[(l+r) shr 1];
 repeat
  while ( length(a[i].sum)>length(m.sum) ) or ( (length(a[i].sum)=length(m.sum)) and (a[i].sum>m.sum) ) or ( (a[i].sum=m.sum) and (a[i].nam<m.nam) ) do inc(i);
  while ( length(a[j].sum)<length(m.sum) ) or ( (length(a[j].sum)=length(m.sum)) and (a[j].sum<m.sum) ) or ( (a[j].sum=m.sum) and (a[j].nam>m.nam) ) do dec(j);
  if i<=j then
   begin
    t:=a[i];
    a[i]:=a[j];
    a[j]:=t;
    inc(i);
    dec(j);
   end;
 until i>j;
 if i<r then qsort(i,r);
 if l<j then qsort(l,j);
end;

procedure main;
var
 i:longint;
begin
 for i:=1 to n do writeln(a[i].nam);
end;

begin
 assign(input,'grade.in'); reset(input);
 assign(output,'grade.out'); rewrite(output);
 
 init;
 qsort(1,n);
 main;
 
 close(input); close(output);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值