谁拿了奖学金?
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
算法:模拟
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.