谁拿了奖学金?(money)

24 篇文章 0 订阅
谁拿了奖学金?

Time Limit:10000MS  Memory Limit:65536K
Total Submit:18 Accepted:13 

Description 
期中考考完了,总要排排名次。该校有个特殊的规定:前m(m<=60)名学生有奖学金可以拿。面对那批堆积如山的试卷,王主任茫然无措,于是他来向懂NOIP的你来求救,希望你能帮助他。 
注:①该校的名次的排列方式为:先排平均分,若平均分相同,则计算方差,方差小的学生排在前面,若方差也相同,则按考号的先后排列(考号小的排前面)。②平均分、方差的小数部分忽略(即整数部分相同就相等),不是四舍五入。③方差公式为:方差s=(x[1]*x[1]+x[2]*x[2]+…+x[n]*x[n]-n*b*b)/n (其中s为方差,x[1..n]为一组数,b为这组数的平均数) 

Input 
(money) 
第一行三个数n(n <= 1000),m(m <= 60),k(k <= 10),其中n代表学生数,m表示能获得奖学金的学生人数,k代表期中考的课数。 
接下来n行,每行k个数,第i行,第j行表示考号为i的学生第j门课的成绩x(x <= 100) 

Output 
仅有m个数:能获得奖学金的学生的考号(按名次由高到低排列),每两个数之间用一个空格格开

Sample Input

5 3 1 
92
98
93
97
95

Sample Output 

2 4 5

Source 


算法:模拟

又是考快排的一道简单模拟题,这道题我把read写成了readln了,惨痛教训啊,下次一定要看清题。


program money;

const
 maxn=1000;
 
type
 atp=record
  mid,s,num:longint;
 end;

var
 n,m,k:longint;
 a:array [0..maxn] of atp;

procedure init;
var
 i,j,xx,cs:longint;
 s,mid:real;
begin
 readln(n,m,k);
 for i:=1 to n do
  begin
   s:=0;
   mid:=0;
   for j:=1 to k do
    begin
     read(xx);
     s:=s+sqr(xx);
     mid:=mid+xx;
    end;
   readln;
   mid:=mid/k;
   cs:=trunc(mid);
   a[i].mid:=cs;
   s:=(s-k*cs*cs)/k;
   cs:=trunc(s);
   a[i].s:=cs;
   a[i].num:=i;
  end;
end;

procedure qsort(l,r:longint);
var
 i,j:longint;
 mm,t:atp;
begin
 i:=l;
 j:=r;
 mm:=a[(l+r) shr 1];
 repeat
  while (a[i].mid>mm.mid) or ( (a[i].mid=mm.mid) and (a[i].s<mm.s) ) or ( (a[i].mid=mm.mid) and (a[i].s=mm.s) and (a[i].num<mm.num) ) do inc(i);
  while (a[j].mid<mm.mid) or ( (a[j].mid=mm.mid) and (a[j].s>mm.s) ) or ( (a[j].mid=mm.mid) and (a[j].s=mm.s) and (a[j].num>mm.num) ) 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 print;
var
 i:longint;
begin
 for i:=1 to m do write(a[i].num,' ');
end;

begin
 assign(input,'money.in'); reset(input);
 assign(output,'money.out'); rewrite(output);
 
 init;
 qsort(1,n);
 print;

 close(input); close(output);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值